Отправить форму в рельсах 3 Ajax-способом (с JQuery) - PullRequest
76 голосов
/ 17 июля 2011

Я новичок в рельсах и 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

Ответы [ 6 ]

106 голосов
/ 17 июля 2011

Вы хотите:

  1. Остановить нормальное поведение отправки.
  2. Отправьте его через ajax на сервер.
  3. Получите ответ и измените все соответственно.

Код ниже должен сделать это:

$('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
});
58 голосов
/ 15 апреля 2013

Если вы используете :remote => true в своих формах, вы можете отправить их с помощью JavaScript с помощью

$('form#myForm').trigger('submit.rails');
33 голосов
/ 09 мая 2013

В Rails 3 предпочтительным способом отправки ajax-формы является использование Rails-ujs.

По сути, вы разрешаете Rails-ujs выполнять отправку ajax за вас (и вам не нужно писать какие-либоJS код).Затем вы просто пишете js-код для захвата ответного события (или других событий) и делаете свое дело.

Вот код:

Сначала используйте параметр remote в 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
});

Есть несколько событий , к которым вы можете подключиться.

13 голосов
/ 17 июля 2011

Чтобы отправить форму через AJAX, вы можете просто передать :remote => true помощнику form_for.По умолчанию rails 3.0.x использует прототип js lib, но вы можете изменить его на jquery с гемом jquery-rails (который по умолчанию для rails 3.1).bundle install это и затем rails g jquery:install для замены файлов прототипов jquery.

После этого вам просто нужно обработать обратный вызов.Взгляните на эту заставку

2 голосов
/ 29 марта 2016

это очень важно в вашем запросе, с помощью ajax остановите поведение по умолчанию, отправьте remote: true в вашей форме для

<%= 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
});
0 голосов
/ 01 февраля 2017

Ничто здесь не помогло мне, моя проблема была в том, что модальная библиотека jQuery не позволяла отправлять мои формы через удаленные данные, если я вызывал модальное окно, но я нашел исправление.

Сначала добавьте плагин jQuery Form в директорию 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);
        }
      })
    })

  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...