ActionView中的escape_javascript方法将撇号'
转义为反斜杠撇号\'
,在解析为JSON时会出错。
例如,“我在这里”的消息在打印为:
时是有效的JSON{"message": "I'm here"}
但是,<%= escape_javascript("I'm here") %>
输出"I\'m here"
,导致无效的JSON:
{"message": "I\'m here"}
是否有补丁来修复此问题,或者在打印到JSON时有其他方法来转义字符串?
答案 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")) %>