Я новичок в рельсах и jQuery. У меня есть две отдельные формы на одной странице, и я хочу отправить их отдельно с помощью ajax (с помощью jQuery). Вот как далеко я зашел. Может ли кто-нибудь добавить или исправить этот код, чтобы он работал. Я использую Rails 3.1 и jQuery 1.6. Заранее спасибо.
application.js
$(".savebutton").click(function() {
$('form').submit(function() {
$(this).serialize();
});
});
первая форма:
<%=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%>
вторая форма:
<%=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 имеет ту же форму, что и SchoolController
routes.rb
, вам необходимо убедиться, что вы используете POST, а не GET. Используя jQuery, просто добавьтеtype: 'POST'
к$.ajax
вызову.$(CODE).submit();
вызов, чтобы заставить его выполнить, затем он отправляет 2 сообщения. Есть идеи?type: 'POST'
к ajax-call.Если вы используете
:remote => true
в своих формах, вы можете отправить их с помощью JavaScript с помощью$('form#myForm').trigger('submit.rails');
источник
.ajax
вы не сможете обрабатывать данные об успехах и ошибках в вашем шаблоне create.js.erb, как следовало бы. Попробуйте использовать.submit()
второй раз, и вашremote => true
токен и токен авторизации потеряны..trigger
Rock, ваша форма сделает его #create как следует, рендеринг create.js.erbВ Rails 3 предпочтительный способ отправки формы ajax - использование Rails-ujs.
В основном вы позволяете Rails-ujs выполнять отправку ajax за вас (и вам не нужно писать какой-либо код js). Затем вы просто пишете js-код для захвата события ответа (или других событий) и делаете свое дело.
Вот код:
Во-первых, используйте удаленную опцию в form_for, чтобы форма по умолчанию отправлялась через ajax:
form_for :users, remote:true do |f|
Затем, когда вы хотите выполнить какое-либо действие на основе статуса ответа ajax (например, успешный ответ), напишите логику javscript следующим образом:
$('#your_form').on('ajax:success', function(event, data, status, xhr) { // Do your thing, data will be the response });
Есть несколько событий, к которым вы можете подключиться.
источник
data: {type: 'text'}
атрибут, как описано на api.jquery.com/jquery.ajax, иначе запрос может завершиться ошибкой из-за ошибки синтаксического анализа JSON.Чтобы отправить форму через AJAX, вы можете просто передать
:remote => true
ееform_for
помощнику. По умолчанию rails 3.0.x использует прототип js lib, но вы можете изменить его на jquery с помощьюjquery-rails
gem (что по умолчанию для rails 3.1).bundle install
его, а затемrails g jquery:install
заменить файлы прототипов на jquery.После этого вам просто нужно обработать обратный вызов. Взгляните на этот скринкаст
источник
это очень важно в вашем запросе с помощью ajax, чтобы остановить поведение по умолчанию, отправьте remote: true в вашей form_for
<%= form_for :session, url: sessions_path, remote: true, html: { class: "form-signin" } do |f| %> <% end %>
в вашем 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 });
источник
У меня здесь ничего не работало, моя проблема заключалась в том, что модальная библиотека jQuery нарушала бы отправку моих форм через удаленные данные, если бы я открывал модальное окно, но я нашел исправление.
Сначала добавьте плагин формы jQuery в каталог javascript ваших ресурсов: http://malsup.github.io/jquery.form.js
Теперь переопределите метод отправки для вашей формы. Например, вы можете сделать что-то вроде этого:
= 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); } }) }) })
источник