Rails escape_javascript通过转义单引号创建无效的JSON

ActionView中的escape_javascript方法将撇号'转义为反斜杠撇号\' ,在解析为JSON时会出错。

例如,打印时,“我在这里”消息是有效的JSON:

 {"message": "I'm here"} 

但是, 输出"I\'m here" ,导致无效的JSON:

 {"message": "I\'m here"} 

是否有补丁来修复此问题,或者在打印到JSON时转义字符串的替代方法?

只需在字符串上调用.to_json即可正确转义,例如

 "foo'bar".to_json 

我最终根据ActionView::Helpers::JavaScriptHelper escape_json方法向我的application_helper.rb添加了一个新的escape_json方法:

 JSON_ESCAPE_MAP = { '\\' => '\\\\', ' '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"' } def escape_json(json) json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] } end 

有人知道比这更好的解决方法吗?

我有一些与此类似的问题,我需要将Javascript命令放在Rails模板的底部,该模板将字符串放入jQuery.data以供以后检索和使用。

每当我在字符串中使用单引号时,我在加载页面时会收到JavaScript错误。

这是我做的:

 -content_for :extra_javascript do :javascript $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}"); 

可能需要更多详细信息,但JSON字符串必须使用双引号。 单引号在JavaScript字符串中是可以的,但在JSON中没有。

github / rails中已经存在问题https://github.com/rails/rails/issues/8844

修复将字符串标记为html_safe

 <%= escape_javascript("I'm here".html_safe) %> 

甚至更好,你可以消毒字符串

 <%= sanitize(escape_javascript("I'm here")) %> <%= escape_javascript(sanitize("I'm here")) %>