以ajax方式在rails 3中提交表单(使用jQuery)

kat*_*tie 77 ajax jquery ruby-on-rails-3

我是rails和jQuery的初学者.我在一个页面中有两个单独的表单,我想以ajax方式(使用jQuery)单独提交它们.这是我得到了多远.任何人都可以添加或修复此代码以使其工作.我正在使用Rails 3.1和jQuery 1.6.先感谢您.

的application.js

$(".savebutton").click(function() { 
    $('form').submit(function() {
         $(this).serialize();
    });
}); 
Run Code Online (Sandbox Code Playgroud)

第一种形式:

<%=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%>
Run Code Online (Sandbox Code Playgroud)

第二种形式:

<%=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%>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

CourseController与SchoolController的形状相同

Joh*_*han 108

你想要:

  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
});
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说不适用于上述形式.我相信这是因为我试图发布到一个资源,它使用相同的索引URL并在Rails中创建方法,这需要强制请求为POST.如果要为`routes.rb`中已声明为资源的内容提交表单请求,则需要确保使用的是POST而不是GET.使用jQuery,只需将`type:'POST'`添加到`$ .ajax`调用中. (14认同)

Mil*_*uzz 58

如果您:remote => true在表单上使用,可以使用JavaScript提交

$('form#myForm').trigger('submit.rails');
Run Code Online (Sandbox Code Playgroud)

  • 我被我的代码中的一个错误所困扰,所以发布以帮助那些最终陷入我的情况的人.我有一个隐藏的字段并且意外地(复制和粘贴错误),将字段标记为"必需".该字段没有分配值(应该由我静态分配).由于它是隐藏的,因此没有任何UI工件,rails将指向您进行修复.相反,当提交表单时,rails会默默地触发一个事件,如果你不订阅,你将不知道到底发生了什么,以及为什么表单永远不会被提交. (4认同)

lul*_*ala 33

Rails 3中进行ajax表单提交的首选方法是使用Rails-ujs.

基本上你允许Rails-ujs为你做ajax提交(你不需要编写任何js代码).然后你只需编写js代码来捕获响应事件(或其他事件)并做你的事情.

这是一些代码:

首先,使用form_for中远程选项,因此默认情况下将通过ajax提交表单:

form_for :users, remote:true do |f|
Run Code Online (Sandbox Code Playgroud)

然后,当你想根据ajax响应状态(例如成功的响应)做一些动作时,写下javscript逻辑,如下所示:

$('#your_form').on('ajax:success', function(event, data, status, xhr) {
  // Do your thing, data will be the response
});
Run Code Online (Sandbox Code Playgroud)

几个事件可以挂钩.


bas*_*eck 13

要通过AJAX提交表单,您只需传递:remote => trueform_for帮助程序即可.默认情况下,rails 3.0.x使用原型js lib,但您可以使用jquery-railsgem 将其更改为jquery (这是rails 3.1的默认值).bundle install然后rails g jquery:install用jquery替换原型文件.

之后,您只需要处理回调.看看这个截屏视频