我在页面的javascript块中有这一行:
res = foo('<%= @ruby_var %>');
处理@ruby_var
中有单引号的情况的最佳方法是什么?否则它将破坏JavaScript代码。
答案 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
)而不是<%=
来执行类似print
或puts
的操作。 p
总是打印字符串,好像它是用双引号括起来的代码:
>> p "String ' \" String"
"String ' \" String"
# => nil
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil
答案 6 :(得分:0)
您可能希望使用以下第一个属性来摆脱&#34;从您的字符串开始,然后您可以继续使用json
函数。
res = foo('<%= @ruby_var %>.first');