如何使用.js.erb将ruby数据结构转换为javascript数据结构?



我有一个。js。动词模板和我正在做的:

var foo = <%= [1,2,3] %>;
var foo2 = <%= [1,2,3].to_json %>;
var foo3 = <%= ["bar"].to_json %>;
var foo4 = <%= {:foo => "bar"}.to_json %>;

foo = 123

foo2 = [1,2,3]

foo3是未定义的(因为浏览器报错解析错误)

foo4是未定义的(因为浏览器报错解析错误)


我能弄清楚如何使foo3工作的唯一方法是:

var foo3 = "<%= ['bar'].to_json %>";    # foo3 => "[&quot;bar&quot;]"
foo3.replace(/&quot;/g, """))          # => "['bar']"  <-- looks like eval should work...
eval(foo3.replace(/&quot;/g, """))[0]; # => "bar" ... it works

我不能忍受这样的工作……我试着做:

var foo4 = <%= "{:foo => 'bar'}.to_json" %>;  # foo4 => "{&quot;foo:&quot;:&quot;bar&quot;}" %>;
foo4.replace(/&quot;/g, """));               # => "{"foo":"bar"}"  <-- looks like eval should work
eval(foo4.replace(/&quot;/g, """));           # => "Parse error"   <-- but it doesn't...

底线,所有这些需要使用eval的东西是荒谬的——一定有更好的方法!有人能告诉我这是什么吗?

问题是。to_json逃避了html实体!

解决方案是:

var foo = & lt; % = {: lol =>["lmaonade"、"rotflcopter"]}.to_json.html_safe} %>

这给了我:

{"lol": ["lmaonade", "rotflcopter"]}

如果您需要处理@foo为nil时,请尝试:

var foo = <%= (@foo.kind_of?(Array) ? $foo : [] ).to_json %>;

将Ruby哈希值转换为Javascript对象的操作如下:

<% hash = {:foo=>'bar'} %>
var js_hash = <%= hash.to_json %>;

最新更新