Je suis un débutant dans Rails et jQuery. J'ai deux formulaires séparés sur une page et je veux les soumettre séparément de manière ajax (avec jQuery). C'est à quelle distance je suis. Quelqu'un peut-il ajouter ou corriger ce code pour le faire fonctionner. J'utilise Rails 3.1 et jQuery 1.6. Merci d'avance.
application.js
$(".savebutton").click(function() {
$('form').submit(function() {
$(this).serialize();
});
});
première forme:
<%=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%>
deuxième forme:
<%=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 a la même forme que SchoolController
Tu veux:
Le code ci-dessous devrait le faire:
$('form').submit(function() {
var valuesToSubmit = $(this).serialize();
$.ajax({
type: "POST",
url: $(this).attr('action'), //sumbits it to the given url of the form
data: valuesToSubmit,
dataType: "JSON" // you want a difference between normal and ajax-calls, and json is standard
}).success(function(json){
console.log("success", json);
});
return false; // prevents normal behaviour
});
Si vous utilisez :remote => true
sur vos formulaires, vous pouvez les soumettre avec JavaScript avec
$('form#myForm').trigger('submit.Rails');
Dans Rails 3, le moyen préféré pour soumettre un formulaire ajax est d'utiliser Rails-ujs.
En gros, vous autorisez Rails-ujs à effectuer la soumission ajax pour vous (sans avoir à écrire de code js). Ensuite, il vous suffit d'écrire du code js pour capturer l'événement de réponse (ou d'autres événements) et faire votre travail.
Voici du code:
D'abord, utilisez l'option remote dans form_for pour que le formulaire soit soumis via ajax par défaut:
form_for :users, remote:true do |f|
Ensuite, lorsque vous souhaitez effectuer certaines actions en fonction du statut de la réponse ajax (par exemple, réponse réussie), écrivez la logique jscript comme suit:
$('#your_form').on('ajax:success', function(event, data, status, xhr) {
// Do your thing, data will be the response
});
Il y a plusieurs événements auxquels vous pouvez raccrocher.
Pour soumettre le formulaire via AJAX, vous pouvez simplement passer :remote => true
à l'assistant form_for
. Par défaut, Rails 3.0.x utilise le prototype js lib, mais vous pouvez le changer en jquery avec la gemme jquery-Rails
(valeur par défaut de Rails 3.1). bundle install
it puis Rails g jquery:install
pour remplacer les fichiers de prototype par jquery.
Après cela, il vous suffira de gérer le rappel. Jetez un oeil à this screencast
il est très important dans votre demande avec ajax d'arrêter le comportement par défaut, envoyez remote: true dans votre formulaire
<%= form_for :session, url: sessions_path, remote: true, html: { class: "form-signin" } do |f| %>
<% end %>
dans ton 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
});
Rien ici ne fonctionnait pour moi, mon problème était que la bibliothèque modale de jQuery empêcherait mes formulaires d'être soumis via des données distantes si je créais une fenêtre modale, mais je trouvais un correctif.
Commencez par ajouter le plug-in jQuery Form à votre répertoire javascript actifs: http://malsup.github.io/jquery.form.js
Maintenant, remplacez la méthode d'envoi pour votre formulaire. Par exemple, vous pouvez faire quelque chose comme ceci:
= 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);
}
})
})
})