2011-12-20 16 views
13

En mi rieles aplicación Tengo una forma remota que se ve algo como esto por ejemplo:presentar un raíles forma remota con javascript

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true do %> 
    <%= text_field_tag :search, params[:search], :id => 'search-field' %> 
    <%= submit_tag 'Go' %> 
<% end %> 

Ahora me gustaría presentar este formulario a través de JavaScript y activar todos los carriles de forma remota devoluciones de llamada. Hasta ahora he intentado algunas cosas, pero nada parece estar funcionando.

cosas que he intentado:

$('#my-form').trigger('onsubmit') 

$.rails.callFormSubmitBindings($('#search-form')) 

pero sin suerte hasta ahora. ¿Algunas ideas?

+1

¿Qué pasa con '$ (" # my-form "). Submit()'? ¿Lanza las devoluciones de llamada necesarias? Sé que he usado similares en [mi propio código] (https://github.com/BinaryMuse/BG-Tracker/blob/01a958924fc8cc67c0effa340e72ede43298b8fd/app/assets/javascripts/battlegroups.js.coffee#L5). –

+0

Sí lo hace! : P – Matthew

Respuesta

7

Puede simplemente usar .submit();

$("#my-form").submit(); 
+0

Ya funcionó perfectamente. Mucho más simple de lo que pensaba ... – Matthew

+6

Solo quiero agregar que debe invocarse en un objeto jQuery. Por ejemplo, si haces algo como '$ ('. A'). Change (función {this.submit()})' no funcionará. Debe envolver 'this' en un objeto jQuery como' $ (this) '. Entonces puedes llamar al sumbit sobre eso. –

+2

Advertencia: el formulario NO se enviará de forma remota (por ajax). En su lugar, se realizará una actualización completa – Fred

1

¿Qué tal pasar json desde el controlador y capturarlo por su js.

Ahora, la acción del controlador como

respond_to do |format| 
     if some condition 
     format.json { render :json => {:success => true} } 
     format.html{ redirect_to some_path, :notice => "successfully created" } 
     else 
     ... 
     end 
end 

y capturar el JSON en js como

$('#my-form').bind 'ajax:success', (event,data) -> 
    if(data.success == true) 
    ... 

No es exactamente lo que está buscando, pero espero que esto resulta ser de alguna ayuda.

+1

Creo que simplemente está preguntando cómo enviar el formulario. – andrewpthorp

+0

no se enviará el formulario de forma remota por sí mismo a 'some_path' como se indica. – Abhaya

46

Esto es simplemente en forma de rieles:

$("#myform").trigger('submit.rails'); 
+2

Esta es la verdadera respuesta. Preserva el comportamiento de presentación ajax de una forma remota. Gracias ! – Fred

+0

¡Bienvenido! –

+1

Tenga en cuenta el comentario de Ismael: debe envolver su formulario en un objeto jQuery para el comportamiento de envío remoto. Así que no 'myForm.submit()', pero '$ (myForm) .submit()'. No detecté el problema durante bastante tiempo tampoco ... – NobodysNightmare

18

En Rails 5.1+, que sustituye al antiguo jquery-ujs con un no-jquery rails-ujs, el trabajo de las respuestas anteriores ya no, siempre enviar el formulario HTML a través de un HTTP solicitud. Esta es la forma en que se activa los nuevos carriles se someten controlador de eventos:

var elem = document.getElementById('myform') // or $('#myform')[0] with jQuery 
Rails.fire(elem, 'submit'); 

(No puedo decir cuánto tiempo me llevó a entender que uno ...) Por alguna razón, los eventos regulares no burbujean correctamente al controlador de eventos delegados attached by rails usando el nuevo delegate function de rieles, cuando jQuery los desencadena.

+4

THX! Esto me hubiera llevado una eternidad calcularlo ... – ErwinM

Cuestiones relacionadas