true simple remote rails form_with form_tag form example and ruby-on-rails ruby-on-rails-4 turbolinks remote-forms

ruby-on-rails - simple - ruby on rails ajax example



Rails turbolinks rompen enviar formulario remoto (2)

Turbolinks no recarga completamente tu página, sino solo una parte. Esto es lo que los hace tan rápidos, sin embargo, si tiene JavaScript que requiere una recarga de página completa, tendrá problemas. La razón por la que funciona con una actualización es porque ahora fuerza a la página a recargarse por completo.

Editar: Vale la pena probar esta joya: https://github.com/kossnocorp/jquery.turbolinks

Para obtener un poco de información adicional sobre el funcionamiento interno de turbolinks: http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks

O bien: https://github.com/rails/turbolinks

Ps También asegúrese de que javascript_include_tag esté dentro de la etiqueta head (y no en el cuerpo)

Tengo un problema bastante extraño al usar Rails 4, Turbolinks y una forma remota. Tengo un formulario que se parece a:

<%= form_for [object], remote: true do |f| %> <td><%= f.text_field :name, class: ''form-control'' %></td> <td><%= f.email_field :email, class: ''form-control'' %></td> <td><%= f.submit button_name, class: ''btn btn-sm btn-primary'' %></td> <% end %>

Esta forma agrega (crea) un nuevo objeto. Sin embargo, no siempre funciona:

  • Cuando cargo la página directamente usando la URL o una actualización; funciona
  • Cuando navego desde mi aplicación a esta página; falla

Al deshabilitar Turbolinks para este enlace, la página funcionó perfectamente.

Tengo dos preguntas:

  1. ¿Por qué esto no funciona? ¿Esto se debe a que los controladores remotos no están conectados al botón debido a un problema de JQuery / Turbolinks?
  2. ¿Cómo puedo solucionar este problema?

Gracias por adelantado.

Solución

Gracias a @ rich-peck, la solución fue agregar una pieza de javascript que envía manualmente el formulario al hacer clic en el botón:

<%= javascript_tag do %> var id = "#<%= dom_id(f.object) %>"; var inputs = $(id).parent().find(''input''); console.log(inputs); $(id).parent().find(''button'').on(''click'', function(e) { e.preventDefault(); $(id).append(inputs.clone()); $(id).submit(); }); <% end %>

Este código agrega javascript a la fila de la tabla de formularios, obteniendo las entradas, anexándolas al ID y enviando el formulario. El preventDefault (); impide que la consulta se envíe dos veces cuando la página se actualiza y el formulario realmente funciona.


Turbolinks

Como se mencionó, el problema con Turbolinks es que recarga la parte <body> del DOM con una llamada ajax, lo que significa que JS no se recarga, ya que está en la cabeza

La forma típica de solucionar este problema es delegate su JS del document , así:

$(document).on("click", "#your_element", function() { //your code here });

Debido a que el document siempre estará presente, activará el JS continuamente

Remoto

Con tu problema, es un poco más complicado

El problema es que confías en el motor JQuery UJS (JavaScript discreto) de Rails, que es difícil de remediar por sí mismo.

Nunca hemos tenido este problema y usamos Turbolinks todo el tiempo, así que supongo que el problema podría estar relacionado con la forma en que está construyendo su formulario / tramitando la solicitud. Este GitHub parecía recrear el problema, y ​​tenía que ver con la tabla

Tal vez podrías intentar:

<%= form_for [object], remote: true do |f| %> <%= f.text_field :name, class: ''form-control'' %> <%= f.email_field :email, class: ''form-control'' %> <%= f.submit button_name, class: ''btn btn-sm btn-primary'' %> <% end %>