在将 Rails 变量用于 Javascript 时转义引号?

Posted

技术标签:

【中文标题】在将 Rails 变量用于 Javascript 时转义引号?【英文标题】:Escaping quotes from Rails Variables when using them for Javascript? 【发布时间】:2011-01-11 09:17:16 【问题描述】:

尝试在 javascript 代码中使用 rails 变量时遇到问题。

例如,我可能会定义一个link_to_remote,带有参数 :complete => "alert('my_var');"

如果my_var = "I'm testing.",则由于单引号过早关闭代码,javascript 代码将中断。如果我尝试使用escape_javascript(my_var) 将引用变成\',它似乎无法解决问题。

我注意到当您尝试alert('I\'m testing'); 时会出现问题,但如果您尝试alert('I\\'m testing'),它会起作用。由于 escape_javascript 只将' 变成\',而不是\\',有人对如何处理这个问题有建议吗?

谢谢! 埃里克

【问题讨论】:

【参考方案1】:

当您尝试alert('I\'m testing'); 时出现问题

反斜杠也是 Ruby 字符串中的转义符!所以字符串文字:

"alert('I\'m testing');"

表示字符串:

alert('I'm testing');

反斜杠在 JavaScript 看到它之前就已经消失了。当您在 inside Ruby 字符串文字中编写 JavaScript 字符串文字时,您需要转义转义符 \\,以获得真正的 \,然后在 JavaScript 中转义撇号。

escape_javascript 正确生成 JavaScript 的反斜杠,如果反斜杠包含在其输入中。但同样,如果您正在编写字符串文字,则必须转义反斜杠以获得真正的反斜杠:

escape_javascript("\b")     -> this is a backspace character!
escape_javascript("\\b")    -> this is backslash-then-letter-b;
                               escaped for JavaScript literal to double-backslash-then-b.

所以,这很好:

"'"+escape_javascript(myvar)+"'"

或者,您可以使用 JSON 编码器来创建 JavaScript 字符串文字,包括周围的引号。

【讨论】:

它还有一个简单的“j”别名:“'”+j(myvar)+"'" 给近期读者的注意事项:从 rails 3.2(可能更早)开始,方法是 escape_javascript 而不是 javascript_escape

以上是关于在将 Rails 变量用于 Javascript 时转义引号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?

JavaScript:变量

Rails:在 CoffeeScript 或 JavaScript 资产文件中访问控制器实例变量

将 Rails 3.1 项目部署到 Heroku 时出现问题:找不到 JavaScript 运行时

用于 JavaScript 的 Rails 3.1 资产管道

如何在Rails视图中将Ruby变量传递给JavaScript函数?