2011-05-03 29 views
12
  • ¿cómo puedo ejecutar código ruby ​​dentro de javascript en haml?
  • si uso var = #{message} en mi ejemplo me sale undefined local variable or method message
  • cuando muevo - message = 'it works' anterior :javascript todo funciona bien

Quiero correr iteración.each dentro :javascript. Vea el último ejemplo de código para ver lo que necesito en el código final de JavaScript. ¿Dónde tengo que hacer un bucle de algunas variables ruby ​​(o un hash de hashes de hashes?) Para obtener esto. Los datos (= 'elementos básicos') pueden tener pocos elemenets. Puede tener niños con pocos elementos, etc.cómo ejecutar ruby ​​en haml en la definición de javascript?

lo que este código haml

%html 
    %head 
    :javascript 
     $(document).ready(function() { 
     - message = 'it works' 
      var = message 

     }); 
%body 
    - message2 = 'hi' 
    = message2 
    %div{:id =>"jstree"} 

me da este código html

<html> 
    <head> 
    <script type='text/javascript'> 
     //<![CDATA[ 
     $(document).ready(function() { 
      - message = 'hi' 
      var = message 

     }); 
     //]]> 
    </script> 
    </head> 
    <body> 
    hi 
    <div id='jstree'></div> 
    </body> 
</html> 

El código JavaScript final que quiero para producir usando haml es la variable javascript

var data = [{ 
     data: "basics", 
     attr: {}, 
     children: [ 
     {data: "login", attr: {run: "run"}, 
      children: [     
      {data: "login", attr: {}} 
      ] 
     } , 
     {data: "Academic Year", attr: {run: "run"}, 
      children: [     
      {data: "login", attr: {}}, 
      {data: "Academic Year", attr: {filter: "mini", SOF: "yes"}} 
      ] 

     } 
     ] 
     }]; 
+0

Esta pregunta no es fácil de entender. Usted dice que quiere ejecutar 'each', pero no muestra dónde ni cómo. No estoy seguro de qué ajuste la variable 'mensaje' antes de que su secuencia de comandos tenga que ver con su pregunta. ** ¿Qué variables de Ruby tiene y qué quiere como resultado? ** – Phrogz

+1

Posible duplicado: [¿Hay alguna forma de utilizar un bucle de Ruby dentro de la región de JavaScript de Haml?] (Http: // stackoverflow.com/questions/2962119/is-there-a-way-to-use-a-ruby-loop-inside-of-hamls-javascript-region/5864657 # 5864657) – Phrogz

+0

posible duplicado de [Inyectar valores variables en javascript y HAML en RoR] (http://stackoverflow.com/questions/4708369/injecting-variable-values-into-javascript-and-haml-in-ror) –

Respuesta

29

En primer lugar, vamos a revisar lo que parece saber:

  1. Rubí le requiere para definir variables locales antes de usarlos.
  2. Puede ejecutar el código Ruby en líneas fuera de un filtro usando - ....
  3. Utiliza el marcado #{...} para interpolar el código de Ruby dentro de un filtro.

Diga que quiere ejecutar each, pero presumiblemente quiere obtener un resultado de esto; ya que el resultado de #{...} se convierte en una cadena y poner en su código, lo que realmente quiere (probablemente) es map:

%html 
    %head 
    :javascript 
     var foo = []; 
     #{ 
     limit = rand(4)+3 
     array = (0..limit).to_a 
     array.map{ |i| "foo[#{i}] = #{rand(12)};" }.join ' ' 
     } 
     console.log(foo.length); 
    %body 

Ejecutar el código anterior da este resultado:

<html> 
    <head> 
    <script type='text/javascript'> 
     //<![CDATA[ 
     var foo = []; 
     foo[0] = 2; foo[1] = 0; foo[2] = 11; foo[3] = 8; foo[4] = 0; foo[5] = 1; 
     //]]> 
    </script> 
    <body></body> 
    </head> 
</html> 

Como puede ver, el gran bloque #{...} (que puede abarcar varias líneas) ejecuta código Ruby arbitrario. El resultado de la última expresión (en este caso, map{...}.join) se convierte en una cadena y se coloca en el resultado.

+0

entonces, ¿puedo hacer algo más complicado como mi última muestra de código? toda la 'var data' – Radek

+0

@Radek Sí, puede generar cualquier salida que desee. La manera más fácil de producir un literal así es primero requiriendo que la biblioteca JSON en Ruby 'requiera' json '' y luego crear una matriz Ruby con un Hash con todas las subestructuras que desee, y luego simplemente 'var data = # {ruby_variable.to_json}; '... pero ya cubrimos esto en [su otra pregunta] (http://stackoverflow.com/questions/5812789/what-is-the-hash-structure-to-produce-json) – Phrogz

2

The haml documentation para los filtros indica que usted puede interpolar código Ruby usando #{}

- flavor = "raspberry" 
#content 
    :textile 
    I *really* prefer _#{h flavor}_ jam. 
Cuestiones relacionadas