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

Arr*_*rel 18 json escaping ruby-on-rails

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

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

{"message": "I'm here"}
Run Code Online (Sandbox Code Playgroud)

但是,<%= escape_javascript("I'm here") %>输出"I\'m here"导致无效的JSON:

{"message": "I\'m here"}
Run Code Online (Sandbox Code Playgroud)

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

小智 10

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

"foo'bar".to_json
Run Code Online (Sandbox Code Playgroud)


Arr*_*rel 8

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

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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

这是我做的:

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