【问题标题】:Rails escape_javascript creates invalid JSON by escaping single quotesRails escape_javascript 通过转义单引号创建无效 JSON
【发布时间】:2010-04-26 18:48:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails json escaping


    【解决方案1】:

    只需在字符串上调用 .to_json ,它就会被正确转义,例如

    "foo'bar".to_json
    

    【讨论】:

    • 如果字符串例如是 HTML 并且字符串中有双引号,则此方法不起作用。
    • @margusholland - 不正确 - .to_json 完美处理转义双引号
    • "foo'bar".to_json 输出"foo'bar"
    • 不,抱歉。由于任意数量的单引号,我返回的 JSON 显然是中断的。 to_json 不处理它们。 Rails 4.1
    【解决方案2】:

    我最终基于ActionView::Helpers::JavaScriptHelper 中的escape_javascript 方法向我的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
    

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

    【讨论】:

    • 我对 Rails 了解不多。但是有什么方法可以使用render :json,如guides.rubyonrails.org/…api.rubyonrails.org/classes/ActionController/Base.html中所述
    • 这适用于转换对象,但不确定字符串。我会调查的...
    • 目前为止我发现唯一有效的方法。不知道为什么 to_json 决定用一个反斜杠而不是双反斜杠来转义引号,但这让我有一段时间了。谢谢。
    【解决方案3】:

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

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

    这是我所做的:

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

    【讨论】:

      【解决方案4】:

      此处可能需要更多详细信息,但 JSON 字符串必须使用双引号。 JavaScript 字符串中可以使用单引号,但 JSON 中不行。

      【讨论】:

      • 感谢您的回复 - 为了清楚起见,我添加了一个示例。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-24
        • 2017-02-08
        • 2016-07-27
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 2021-09-01
        相关资源
        最近更新 更多