Jestem początkującym w railsach i jQuery. Mam dwa oddzielne formularze na jednej stronie i chcę je przesłać osobno w sposób Ajax (z jQuery). Oto jak daleko dotarłem. Czy ktoś może dodać lub naprawić ten kod, aby działał. Używam Rails 3.1 i jQuery 1.6. Z góry dziękuję.
application.js
$(".savebutton").click(function() {
$('form').submit(function() {
$(this).serialize();
});
});
pierwsza 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%>
druga 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 ma taki sam kształt jak SchoolController
jquery
ajax
ruby-on-rails-3
katie
źródło
źródło
routes.rb
, musisz upewnić się, że używasz POST, a nie GET. Używając jQuery, po prostu dodajtype: 'POST'
do$.ajax
rozmowy.$(CODE).submit();
wywołanie, aby go wykonać, a następnie przesyła 2 posty. Jakieś pomysły?type: 'POST'
do wywołania ajax.Jeśli używasz
:remote => true
w swoich formularzach, możesz przesłać je za pomocą JavaScript za pomocą$('form#myForm').trigger('submit.rails');
źródło
.ajax
, nie będziesz w stanie obsłużyć danych o sukcesie i błędach w szablonie „create.js.erb”, tak jak powinieneś. Spróbuj użyć.submit()
po raz drugi, a Twójremote => true
i token uwierzytelniania zostaną utracone..trigger
skały, Twój formularz będzie #create tak, jak powinien, renderując „create.js.erb”Preferowanym sposobem w Railsach 3 do wysyłania formularzy Ajax jest użycie Rails-ujs.
Zasadniczo pozwalasz Rails-ujs na wysyłanie AJAX za Ciebie (i nie musisz pisać żadnego kodu js). Następnie po prostu piszesz kod js, aby przechwycić zdarzenie odpowiedzi (lub inne zdarzenia) i rób swoje.
Oto kod:
Najpierw użyj opcji zdalnej w form_for, aby formularz był domyślnie przesyłany przez ajax:
form_for :users, remote:true do |f|
Następnie, gdy chcesz wykonać jakąś akcję na podstawie statusu odpowiedzi Ajax (np. Pomyślna odpowiedź), napisz logikę javscript w następujący sposób:
$('#your_form').on('ajax:success', function(event, data, status, xhr) { // Do your thing, data will be the response });
Istnieje kilka wydarzeń, do których możesz się podłączyć.
źródło
data: {type: 'text'}
atrybutu zgodnie z opisem na api.jquery.com/jquery.ajax lub żądanie może się nie powieść z powodu błędu analizy JSON.Aby przesłać formularz przez AJAX, wystarczy, że przekażesz
:remote => true
goform_for
pomocnikowi. Domyślnie rails 3.0.x używa prototypu js lib, ale możesz zmienić go na jquery za pomocąjquery-rails
gem (który jest domyślny dla rails 3.1).bundle install
go, a następnierails g jquery:install
zastąpić pliki prototypów jquery.Następnie wystarczy obsłużyć oddzwonienie. Spójrz na ten screencast
źródło
jest to bardzo ważne w twoim żądaniu z Ajax, zatrzymaj domyślne zachowanie, wyślij remote: true w swoim form_for
<%= form_for :session, url: sessions_path, remote: true, html: { class: "form-signin" } do |f| %> <% end %>
w twoim 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 });
źródło
Nic tutaj nie działało dla mnie, moim problemem było to, że biblioteka modalna jQuery uniemożliwiłaby przesyłanie moich formularzy za pośrednictwem danych zdalnych, gdybym przywołał okno modalne, ale znalazłem poprawkę.
Najpierw dodaj wtyczkę jQuery Form Plugin do katalogu javascript zasobów: http://malsup.github.io/jquery.form.js
Teraz zastąp metodę przesyłania dla swojego formularza. Na przykład możesz zrobić coś takiego:
= 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); } }) }) })
źródło