【发布时间】:2016-12-14 18:45:32
【问题描述】:
我在页面的 javascript 块中有这一行:
res = foo('<%= @ruby_var %>');
处理@ruby_var 中包含单引号的情况的最佳方法是什么?否则会破坏 JavaScript 代码。
【问题讨论】:
标签: javascript ruby
我在页面的 javascript 块中有这一行:
res = foo('<%= @ruby_var %>');
处理@ruby_var 中包含单引号的情况的最佳方法是什么?否则会破坏 JavaScript 代码。
【问题讨论】:
标签: javascript ruby
我想我会在 @ruby_var 上使用 ruby JSON 库来为字符串获取正确的 js 语法并去掉 '', fex.:
res = foo(<%= @ruby_var.to_json %>)
(在需要“json”之后,不完全确定如何在页面中执行此操作,或者上述语法是否正确,因为我没有使用那种模板语言)
(另一方面,如果 JSON 曾经更改为与会损坏的 js 不兼容,但是由于相当多的代码使用 eval() 来评估 json,我怀疑这会很快发生)
【讨论】:
Rails 在ActionView::Helpers::JavaScriptHelper 中有专门用于此任务的方法,称为escape_javascript。
在您的示例中,您将使用以下内容:
res = foo('<%= escape_javascript @ruby_var %>');
或者更好的是,使用 j 快捷方式:
res = foo('<%= j @ruby_var %>');
【讨论】:
@ruby_var.gsub(/[']/, '\\\\\'')
这将用撇号转义单引号,确保您的 Javascript 安全!
另外,如果你在 Rails 中,有一堆Javascript-specific tools。
【讨论】:
@ruby_var.gsub(/['\\]/, '\\\\\0')
你能把字符串放在双引号里吗?
res = foo("<%= @ruby_var %>");
【讨论】:
你也可以使用 inspect 假设你知道它是一个单引号:
res = foo(<%= @ruby_var.inspect %>);
【讨论】:
我不太喜欢使用嵌入式 Ruby。但是如何使用p(它调用inspect)而不是<%=,它可能会做类似print 或puts 的事情。 p 总是打印字符串,就好像它是用双引号括起来的代码一样:
>> p "String ' \" String"
"String ' \" String"
# => nil
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil
【讨论】:
您可能希望使用以下第一个属性,从字符串中删除 ",然后您可以继续使用您的 json 函数。
res = foo('<%= @ruby_var %>.first');
【讨论】: