2011-12-31 82 views
8

Busqué todas las preguntas y respuestas sobre este tema, pero todavía no puedo hacer que mi escenario funcione. Quiero activar una acción del botón de clic cuando se selecciona una opción del menú desplegable; parece simple y debería ser muy común con AJAX.select y onChange en un formulario de Ruby on Rails

Éstos son los extractos pertinentes de mi código:

<%= form_for(@test, :html => {:id => "form_id", :name => "MyForm", :remote => "true"}) do |form| %> 
    <%= form.label "Menu1" %> 
    <%= form.select (:Menu1, [["Option1","value1"],["Option2","value2"]], :html_options=>{:onChange=>"javascript: this.form.apply_button_name.click();"}) %> 

    <!-- more select menus and text fields here --> 

    <div class="actions"> 
     <%= form.submit "Apply", :name => "apply_button_name", :remote => "true" %> 
    </div> 
<% end %> 

he usado. ": Distancia => 'verdadero', tanto para la forma y el botón porque esa es la única manera de conseguir AJAX trabajar también probé con y sin "html_options" explícitas y "javascript:"., después me levantase algunas tan respuestas que sugerían que pero eso no ayudó también probé onSelect y onClick en lugar de onChange, pero sigue sin suerte

El generaron. HTML es el siguiente:

Menu1 
    <select id="test_Menu1" name="test[Menu1]"><option value="value1">Option1</option> 
<option value="value2" selected="selected">Option2</option></select> 

Como puede ver, no hay un controlador de eventos onChange en el código HTML; ¿POR QUÉ? ¿Alguien está viendo qué estoy haciendo mal?

Gracias por cualquier ayuda.

Respuesta

14

Modificar su llamada a form.select, así:

<%= form.select :Menu1, [["Option1","value1"],["Option2","value2"]], {}, 
       :onChange=>"javascript: this.form.apply_button_name.click();" %> 
+0

Gracias rabusmar, que ayudó, pero cuando selecciono la opción 1, el controlador se pone valor2 y viceversa. Agregué una tercera opción, y parece que el controlador no es la opción que acabo de seleccionar, ¡sino la anterior! ¿Por qué está haciendo esto? Lo comprobé agregando puts "@ test.Menu1 =" + @ test.Menu1.to_s + "\ n" al controlador. – rh4games

+0

Es porque el valor no se ha establecido cuando se envía el formulario. Puede usar 'setTimeout' en su controlador para que envíe el valor correcto. – rabusmar

+0

¿Puedo preguntar, cómo hacer referencia a un JavaScript fuera de este archivo, en lugar de un JavaScript en línea? – Orz

3

Si examina la documentación para:

API Dock Ruby on Rails select

Usted verá que la forma de selección de ayuda toma la forma:

select (object, method, choices, options = {}, html_options = {})

Si no pasa nada para la opción hash (en su caso, esto será un hash vacío), la forma cree que su hash html_options son sus opciones hash, y se confunde.

Una forma de comprobar esto es agregar algo como {: onchange => "alert ('Hello');"} y ver si el evento se desencadena correctamente, o alternativamente, en su página web real, haga clic derecho el elemento seleccionado e inspeccionarlo. Si no hay una opción onchange en el html, eso significa que los rieles forman helper confunden las opciones html con las otras opciones. Por lo tanto, lo que debe tener:

<%= form.select (:Menu1, [["Option1","value1"],["Option2","value2"]], {}, {:onChange=>"handler();"} %> 

Asegúrese de incluir el hash VACÍO DE LAS OPCIONES que las opciones de HTML y que debe estar bien. No creo que necesites las opciones html_options y javascript que tienes.

Por último, si onChange no funciona, trate de usar onchange sin capital C.

+0

No funciona. – Aravin