【问题标题】:Javascript with embedded Ruby: How to safely assign a ruby value to a javascript variable嵌入 Ruby 的 Javascript:如何安全地将 ruby​​ 值分配给 javascript 变量
【发布时间】:2016-12-14 18:45:32
【问题描述】:

我在页面的 javascript 块中有这一行:

res = foo('<%= @ruby_var %>'); 

处理@ruby_var 中包含单引号的情况的最佳方法是什么?否则会破坏 JavaScript 代码。

【问题讨论】:

    标签: javascript ruby


    【解决方案1】:

    我想我会在 @ruby_var 上使用 ruby​​ JSON 库来为字符串获取正确的 js 语法并去掉 '', fex.:

    res = foo(<%= @ruby_var.to_json %>)
    

    (在需要“json”之后,不完全确定如何在页面中执行此操作,或者上述语法是否正确,因为我没有使用那种模板语言)

    (另一方面,如果 JSON 曾经更改为与会损坏的 js 不兼容,但是由于相当多的代码使用 eval() 来评估 json,我怀疑这会很快发生)

    【讨论】:

    【解决方案2】:

    Rails 在ActionView::Helpers::JavaScriptHelper 中有专门用于此任务的方法,称为escape_javascript

    在您的示例中,您将使用以下内容:

    res = foo('<%= escape_javascript @ruby_var %>');
    

    或者更好的是,使用 j 快捷方式:

    res = foo('<%= j @ruby_var %>');
    

    【讨论】:

      【解决方案3】:
      @ruby_var.gsub(/[']/, '\\\\\'')
      

      这将用撇号转义单引号,确保您的 Javascript 安全!

      另外,如果你在 Rails 中,有一堆Javascript-specific tools

      【讨论】:

      • 如果代码中已经有\怎么办?您需要在转义之前转义 \ '。
      • 是的,要处理本提利的案子,您需要:@ruby_var.gsub(/['\\]/, '\\\\\0')
      【解决方案4】:

      你能把字符串放在双引号里吗?

      res = foo("<%= @ruby_var %>"); 
      

      【讨论】:

      • 但是如果@ruby_var 中有双引号呢?
      【解决方案5】:

      你也可以使用 inspect 假设你知道它是一个单引号:

      res = foo(<%= @ruby_var.inspect %>);
      

      【讨论】:

        【解决方案6】:

        我不太喜欢使用嵌入式 Ruby。但是如何使用p(它调用inspect)而不是&lt;%=,它可能会做类似printputs 的事情。 p 总是打印字符串,就好像它是用双引号括起来的代码一样:

        >> p "String ' \" String"
        "String ' \" String"
        # => nil  
        >> p 'alpha " \' alpha'
        "alpha \" ' alpha"
        # => nil  
        

        【讨论】:

          【解决方案7】:

          您可能希望使用以下第一个属性,从字符串中删除 ",然后您可以继续使用您的 json 函数。

          res = foo('<%= @ruby_var %>.first'); 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-05
            • 1970-01-01
            • 2014-03-04
            • 1970-01-01
            • 2020-10-15
            相关资源
            最近更新 更多