2011-10-18 35 views
7

tengo una plantilla .js.erb y estoy haciendo:¿cómo puedo convertir estructuras de datos ruby ​​a estructuras de datos javascript con .js.erb?

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

foo es igual a 123

foo2 es igual a [1,2,3]

no está definido foo3 (porque el navegador se queja de un error de análisis)

foo4 no está definido (porque el navegador se queja de un error de análisis)


La única manera de que pudiera encontrar la manera de llegar a foo3 trabajo fue hacer:

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 

no pude foo4 a trabajar de esta manera ... Intenté hacer:

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 pocas palabras, todo esto que necesita usar eval es ridículo, ¡DEBE haber una manera mejor! ¿Puede alguien por favor aclararme lo que es?!?!

+2

foo.to_json es el camino correcto. Por favor, muéstranos a qué foo.to_json se está convirtiendo en la fuente js. –

+0

Si hago var foo = <% = [1,2,3] .to_json%>, funciona ... Inspeccionar foo muestra una matriz js [1,2,3] ... pero si hago var foo = [ "a", "b", "c"]. to_json%> dice "Error de análisis" cuando cargo la página y foo no está definido. – patrick

+0

Por favor * edite * su pregunta para agregar la información adicional. Y muéstranos qué es el ** Javascript ** como resultado del archivo Ruby js erb. Solo nos está diciendo "error de análisis" en el navegador: queremos ver * qué * no se pudo analizar - buscar en el archivo js. –

Respuesta

20

El problema era ecapes .to_json las entidades html!

la solución era hacer:

var foo = <% =. {: Lol => [ "lmaonade", "rotflcopter"]}} to_json.html_safe%>

Esto me da:

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

Bueno, no es .to_json escapando entidades html, es erb que hace eso Y sí, .to_html es el camino a seguir (aunque a veces prefiero usar raw, como en <% = raw {: lol => ["lmaonade", "rotflcopter"]} to_json}%> – radiospiel

0

Si tiene que manejar cuando @foo es nula, intente esto:

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

la conversión de un hash Ruby a un objeto de JavaScript se realiza así:

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

En lugar de un 'si', puede splat-wrap en una matriz: 'var foo = <% = [* @ foo] .to_json%>;' – rewritten

Cuestiones relacionadas