导轨 4 遥控器:真..多次提交表单



>view

= 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 信息。

如果需要,我希望允许用户返回到表单并对其进行更新。我的问题是,我似乎无法多次提交表格。我不确定这是UJS问题还是涡轮链接问题(尽管我禁用了涡轮链接并且仍然有问题(。我还必须添加render layout: false位,这是我过去从未做过的......这是轨道 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)

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

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

据我所知,您将面临两个潜在问题:

  1. 你的Javascript不会捕捉到下一个"提交"
  2. 如果它正在捕获提交,则不会发送它

我会首先确保我的Javascript在这两种情况下都捕捉到submit事件。这显然适用于第一枪,但下一枪则不然:

--

.JS

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

#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委托,看看它是如何工作的。

--

控制器

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

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

为了解决这个问题,我会将后端.js.erb功能移动到 $.ajax({success: 函数中,这样它肯定会将每个请求视为单独的请求,从而允许您每次都呈现它

最新更新