2010-04-14 19 views
53

Tengo un script jQuery que agrega un nuevo campo a un formulario, y este campo contiene información dinámica de un conjunto. El problema es que no puedo encontrar la manera de agregar un array.each para rellenar las opciones del campo de selección dentro de javascript sin romper la sangría HAML y causar errores.Métodos de Ruby dentro de Javascript dentro de HAML

Aquí es mi mejor intento que no funciona:

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>); 
)}; 

también trató con el: javascript filtro sin suerte.

+0

Gracias, parece que alguien solucionó el problema de sangría Markdown para mí. – Josh

Respuesta

96

Por lo general, si algo le duele en haml, significa que debe refactorizar el truco a un ayudante o parcial y llamar eso.

// some_helper.rb 
def new_snazzy_select_tag(options = []) 
    select_tag 'tag_name_here', options.map { |option| [option.id, option.name] } 
end 

Además, se debe utilizar el filtro para hacer :javascript Javascript ya que lo puso en una etiqueta de script para usted y permitir la sangría.

Por último, se puede utilizar en cualquier parte #{ruby_expression} haml, incluyendo :javascript filtros, lo cual es muy útil cuando se necesita para dar salida al resultado de las expresiones de rubí a lugares que no son directamente los contenidos de los elementos HTML.

// some_view.html.haml 
:javascript 
    $('#mylink').click(function() { 
    $('#mylink').after("#{escape_javascript new_snazzy_select_tag(myarray)}"); 
    }; 
+0

Soy bastante nuevo en el desarrollo de aplicaciones web, nunca pensé en usar un ayudante. He mantenido mi código bastante cerca de MVC, pero siempre me pregunté cómo sortear los bucles que necesitaba en las vistas. Eso debería funcionar bien. Gracias por la respuesta. – Josh

+4

Los ayudantes suelen estar a medio camino entre la vista y el controlador. Nunca deberían cambiar ningún estado del lado del servidor, y simplemente están ahí para * ayudar * con una desagradable lógica de vista. Ruby en sus puntos de vista debe ser lo más mínimo posible para ser claro y fácil de mantener. Los ayudantes ayudan con eso. –

+6

TL; DR ...? usa # {ruby_expression} Gracias Alex. – umassthrower

8

Prueba de esto, que debería funcionar (todo lo que hice fue quitar un solo espacio en la quinta línea y añadir la cotización de cierre en el sexto):

%script(type="text/javascript") 
    $('#mylink').click(function() { 
    $('#mylink').after('<select> 
    - @myarray.each do |options| 
    <option value="#{options.id}">#{options.name}</option> 
    </select>'); 
)}; 

Sin embargo, suponiendo que se está ejecutando esto con una secuencia de comandos de rubí o una especie de estructura, ¿por qué no solo hacerlo fuera de la plantilla? Eso probablemente sea lo más apropiado. En rieles/sinatra y otros marcos, puede usar un método de ayuda para hacer esto. Si nos fijamos en la referencia de haml, en realidad desaconsejan el uso de - para evaluar ruby.

+0

Escribí el código de la memoria sin un resaltador de sintaxis, parece que tuve un par de errores. No puedo probar en este momento, pero creo que esto aún fallará. Voy a ir a la ruta de ayudante, que no había pensado antes. Gracias. – Josh

+0

Antes había probado el código que puse en mi respuesta en una aplicación rápida de sinatra, y parecía funcionar bien (sin errores de haml). ¿Seguro que el error no está en otra parte? Aquí está la salida generada que obtuve, con identificadores y nombres de opciones aleatorias: http://pastie.org/920686 – ehsanul

Cuestiones relacionadas