嵌入式Ruby的Javascript:如何安全地将ruby值分配给javascript变量

时间:2008-09-20 00:00:56

标签: javascript ruby

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

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

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

7 个答案:

答案 0 :(得分:11)

我想我会在@ruby_var上使用ruby JSON库来获取字符串的正确js语法并摆脱'',fex。:

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

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

(另一方面,如果JSON曾经改变为与js不相容,但是因为有相当数量的代码使用eval()来评估json,我怀疑这种情况很快就会发生)

答案 1 :(得分:8)

Rails专门针对ActionView::Helpers::JavaScriptHelper escape_javascript {{3}}中的此任务专用。

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

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

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

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

答案 2 :(得分:2)

@ruby_var.gsub(/[']/, '\\\\\'')

这将使用撇号避开单引号,保持您的Javascript安全!

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

您也可以使用检查,假设您知道它将是单引号:

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

答案 5 :(得分:0)

我没有太多使用嵌入式Ruby。但是如何使用p(调用inspect)而不是<%=来执行类似printputs的操作。 p总是打印字符串,好像它是用双引号括起来的代码:

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

答案 6 :(得分:0)

您可能希望使用以下第一个属性来摆脱&#34;从您的字符串开始,然后您可以继续使用json函数。

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