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

时间:2010-04-26 18:48:15

标签: ruby-on-rails json escaping

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

例如,“我在这里”的消息在打印为:

时是有效的JSON
{"message": "I'm here"}

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

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

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

5 个答案:

答案 0 :(得分:10)

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

"foo'bar".to_json

答案 1 :(得分: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

任何人都知道比这更好的解决方法吗?

答案 2 :(得分:5)

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

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

这是我做的:

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

答案 3 :(得分:4)

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

答案 4 :(得分:0)

在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")) %>