Comment puis-je convertir les structures de données ruby ​​en structures de données javascript avec .js.erb?

J'ai un modèle .js.erb et je le fais:

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

Foo égale à 123

Foo2 est égal à [1,2,3]

Foo3 est indéfini (car le navigateur se plaint d'une erreur d'analyse)

Foo4 est indéfini (car le navigateur se plaint d'une erreur d'analyse)


La seule façon de comprendre comment mettre foo3 au travail était de faire:

 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 

Je ne pourrais pas travailler de cette façon … J'ai essayé de faire:

 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... 

En bout de ligne, tout cela nécessitant d'utiliser des choses eval est ridicule – il DOIT être une meilleure façon! Quelqu'un peut-il me éclairer sur ce que c'est?!?!

Le problème était .to_json ecaps les entités html!

La solution était de faire:

Var foo = <% = {: lol => ["lmaonade", "rotflcopter"]}. To_json.html_safe}%>

Cela me donne:

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

Si vous devez gérer quand @foo est nul, essayez ceci:

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

La conversion d'un hash Ruby en un objet Javascript se fait comme suit:

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