rails 4 remote:true ...不止一次提交表单

时间:2014-08-24 01:39:11

标签: jquery ruby-on-rails ajax forms ruby-on-rails-4

查看

= form_tag foo_path, method: :get, class: 'form-inline', role: 'form', remote: true do
  .form-group
    = select_tag :year, options_for_select(@years, Date.today.year), class: 'form-control', prompt: 'Year'
  .form-group
    = select_tag :bar, options_for_select(@bars), prompt: 'Bar', class: 'form-control', disabled: true
  %br
  .form-group
    = submit_tag 'Submit', class: 'btn btn-default'

控制器

def foo
  respond_to do |format|
    format.js { render layout: false }
  end
end

所以我有一个表单,它是一系列标签div中的第一个。您提交表单,提出请求,隐藏表单,并显示下一个选项卡以及表单提交中的ajax'd信息。

如果需要,我想允许用户返回表单并更新它。我的问题是,我似乎无法多次提交表单。我不确定这是一个UJS问题,还是一个turbolinks问题(虽然我禁用了turbolinks但仍有问题)。我还需要添加render layout: false位,这是我过去从未做过的......这是rails 4.1.4。

我可以在控制台中看到正在发出请求,并且正在呈现适当的js。 (这是实际的反应,而不是我的假foo例子)

Started GET "/vehicles/query?utf8=%E2%9C%93&year=2014&mileage=&condition=&commit=Get+a+Quote" for 127.0.0.1 at 2014-08-23 18:24:13 -0700
Processing by VehiclesController#query as JS
  Parameters: {"utf8"=>"✓", "year"=>"2014", "mileage"=>"", "condition"=>"", "commit"=>"Get a Quote"}
  Rendered vehicles/query.js.erb (0.0ms)
Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.0ms)

2 个答案:

答案 0 :(得分:0)

尝试在此过程中禁用提交按钮,执行此操作的轨道方式是:

submit_tag "Submit", data: { disable_with: "Please wait..." }

答案 1 :(得分:0)

从我所看到的,你将有两个潜在的问题:

  
      
  1. 您的Javascript不会抓住下一个“提交”
  2.   
  3. 如果 捕获提交,则不会发送
  4.   

我会首先确保我的Javascript在两种情况下捕获submit事件。这显然适用于第一次拍摄,但下一次没有:

-

<强> JS

因此我会删除remote: true属性,并尝试手动ajax方法,绑定到document&amp;委派:

#app/assets/javascripts/application.rb
$(document).on("submit", "form-inline", function() {
   $.ajax({
      url: $(this).attr("action"),
      data: $(this).serialize();
      success: function(data) {
         // do something here
      };
   });
});

因为它绑定到文档,所以每次执行查找时都应该不受惩罚。您需要阅读javascript delegation以了解其工作原理

-

<强>控制器

如果你的JS正在通过,也许javascript不会在另一端触发。

如果是这种情况,您基本上会得到它将提交您的请求,但控制器将不会执行任何使其工作所需的“后端”工作。

要解决这个问题,我会将后端.js.erb功能移到$.ajax({success:函数中,这样它肯定会将每个请求视为个体,因此每次都可以呈现它