2010-04-26 110 views
17

ActionView中的escape_javascript方法将撇号'作为反斜杠撇号\'进行转义,这会在解析为JSON时给出错误。Rails escape_javascript通过转义单引号创建无效的JSON

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

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

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

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

是否有修补程序来解决这个问题,或打印到JSON时转义字符串的替代方法?

回答

10

只需在字符串上调用.to_json,它就可以正确地转义

"foo'bar".to_json 
+1

如果字符串是HTML,例如在字符串中有双引号,则这不起作用。 – margusholland 2011-07-25 12:07:17

+1

@margusholland - 不正确 - .to_json处理双引号完美转义 – Neall 2011-08-19 18:18:19

+0

''foo'bar“.to_json'输出'”foo'bar“' – 2012-05-08 21:01:15

3

这里可能需要更多细节,但JSON字符串必须使用双引号。单引号可以在JavaScript字符串中使用,但不能使用JSON。

+0

感谢您的答复 - 我加了一个例子清晰。 – Arrel 2010-04-26 19:12:20

6

我结束了添加新escape_json方法我application_helper.rb的基础上,ActionView::Helpers::JavaScriptHelper发现escape_javascript方法:

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 

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

+1

我对Rails了解不多。但有没有什么方法可以使用'render:json',如http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-json和http://api.rubyonrails.org/classes/ActionController/Base所述。 html – 2010-04-26 23:37:59

+0

这适用于转换对象,但不确定有关字符串。我会研究它... – Arrel 2010-04-27 22:08:33

+0

我发现迄今为止唯一的工作。不知道为什么to_json决定用单个反斜杠而不是double来引用引号,但这让我有一段时间了。谢谢。 – dChimento 2014-11-10 21:24:58

5

我不得不与此类似,在这里我需要把JavaScript放在一个Rails模板,把字符串转换为jQuery.data供以后检索和使用的命令下一些问题。

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

这里是我做过什么:

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