Soy un principiante en rieles y jQuery. Tengo dos formularios separados en una página y quiero enviarlos por separado en forma ajax (con jQuery). Hasta aquí llegué. ¿Alguien puede agregar o corregir este código para que funcione? Estoy usando Rails 3.1 y jQuery 1.6. Gracias de antemano.
application.js
$(".savebutton").click(function() { 
    $('form').submit(function() {
         $(this).serialize();
    });
}); 
primera forma:
<%=form_for :users do |f| %>
  <fieldset>
    <legend>Basic details</legend>
    <%= f.label :school %>
    <%= f.text_field :school,:size=>"45",:class=>"round",:id=>"school" %><br/>      
  </fieldset>
  <p><%= button_to "save and continue",{:class=>"savebutton"} %></p>
<%end%>
segunda forma:
<%=form_for :courses do |c| %>
  <fieldset>
    <legend>Your current classes</legend>
    <label>class:</label><%= c.text_field :subject,:size=>"45",:class=>"round" %><br/>
  </fieldset>
  <p><%= button_to "save and continue",{:class=>"savebutton"} %></p>
<%end%>
SchoolController
class SchoolController < ApplicationController
  respond_to :json
  def create
    @school = current_user.posts.build(params[:school].merge(:user => current_user))
    if @school.save
      respond_with @school
    else
      respond_with @school.errors, :status => :unprocessable_entity
    end
  end
end
CourseController tiene la misma forma que SchoolController
                    
                        jquery
                                ajax
                                ruby-on-rails-3
                                
                    
                    
                        Katie
fuente
                
                
            fuente

routes.rb, deberá asegurarse de que está utilizando un POST y no un GET. Usando jQuery, simplemente agreguetype: 'POST'a la$.ajaxllamada.$(CODE).submit();llamada para que se ejecute, luego envía 2 publicaciones. ¿Algunas ideas?type: 'POST'a la llamada ajax.Si usa
:remote => trueen sus formularios, puede enviarlos con JavaScript con$('form#myForm').trigger('submit.rails');fuente
.ajax, no podrá manejar los datos de éxito y error en su plantilla 'create.js.erb' como debería. Intente utilizarlo.submit()por segunda vez yremote => trueperderá su token de autenticación y..triggerrocks, su formulario lo hará #create como debería, renderizando 'create.js.erb'La forma preferida en Rails 3 de realizar el envío de formularios ajax es utilizar Rails-ujs.
Básicamente, permite que Rails-ujs haga el envío ajax por usted (y no necesitará escribir ningún código js). Luego, simplemente escribe código js para capturar el evento de respuesta (u otros eventos) y haz lo tuyo.
Aquí hay algunos códigos:
Primero, use la opción remota en form_for para que el formulario se envíe a través de ajax de forma predeterminada:
form_for :users, remote:true do |f|Luego, cuando desee realizar alguna acción basada en el estado de respuesta de ajax (por ejemplo, respuesta exitosa), escriba la lógica de javscript así:
$('#your_form').on('ajax:success', function(event, data, status, xhr) { // Do your thing, data will be the response });Hay varios eventos a los que puede conectarse.
fuente
data: {type: 'text'}atributo como se documenta en api.jquery.com/jquery.ajax o la solicitud puede fallar debido a un error de análisis JSON.Para enviar el formulario a través de AJAX, simplemente puede pasar
:remote => truealform_forayudante. Por defecto, rails 3.0.x usa prototype js lib, pero puedes cambiarlo a jquery con lajquery-railsgema (que es el predeterminado para rails 3.1).bundle installit y luegorails g jquery:installreemplazar los archivos prototipo con jquery.Después de eso, solo necesitará manejar la devolución de llamada. Echa un vistazo a este screencast
fuente
es muy importante en su solicitud con ajax detener el comportamiento predeterminado, enviar remoto: verdadero en su formulario_para
<%= form_for :session, url: sessions_path, remote: true, html: { class: "form-signin" } do |f| %> <% end %>en tu ajax
$(".form-signin").on("submit", function(e) { $.ajax({ url: $(this).attr('action'), data: $(this).serialize(), type: "POST", dataType: "json", success: function(response) { console.log(response) }, error: function(xhr, textStatus, errorThrown) {} }); e.preventDefault(); //THIS IS VERY IMPORTANT });fuente
Nada aquí funcionó para mí, mi problema era que la biblioteca modal jQuery evitaría que mis formularios se enviaran a través de datos remotos si mostraba una ventana modal, pero encontré una solución.
Primero agregue el complemento de formulario jQuery al directorio de JavaScript de sus activos: http://malsup.github.io/jquery.form.js
Ahora anule el método de envío de su formulario. Por ejemplo, podrías hacer algo como esto:
= form_for @object, html: {class: "ajax_form_submit"}, authorization_token: true do |f| = f.text_input javascript: $(document).on('ready page:load', function() { $(".ajax_form_submit").submit(function () { var form = $(this) form.ajaxSubmit({ success: function (responseText, statusText, xhr) { console.log('success: ajax_form_submit') }, error: function (jqXHR, statusText, errorThrown) { console.log('error: ajax_form_submit'); console.log(jqXHR, statusText, errorThrown); } }) }) })fuente