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