Rails Ajax表单提交两次

时间:2014-01-08 20:59:47

标签: javascript ruby-on-rails ajax jquery asset-pipeline

我有一个通过ajax呈现的表单。该表单还提交了ajax。提交表单时,它会执行两次发布请求。

当有人点击“创建个人资料”链接时,表单会通过链接旁边的ajax呈现。当显示表单时,我需要在视图文件的开头包含一些javascript,因为表单需要这些js文件。这是表格:

<%= javascript_include_tag "/assets/temp_js/jquery-1.8.3.min.js" %>
<%= javascript_include_tag "/assets/jquery_ujs.js" %>
<%= javascript_include_tag "/assets/temp_js/jquery.jscrollpane.min.js" %>
<%= javascript_include_tag "/assets/temp_js/jquery.c2selectbox.js" %>
<%= javascript_include_tag "/assets/temp_js/jquery.colorbox-min.js" %>
<%= javascript_include_tag "/assets/temp_js/functions.js" %>

<%= form_for @profile, :html => { :class => "clearfix" }, remote: true do |f| %>
    <%= f.text_area :description, :title => "Describe yourself and what you do." %>
    <%= f.file_field :pic, :class => "field file-field", :id => "file" %>
<%= f.submit "SAVE" %>

文件已经加载到application.html.erb文件的页面上,但是在显示表单时需要再次加载它们,因为表单中的元素需要javascript。唯一的问题是两个顶级的javascript文件由于某种原因导致表单发布两次。我无法摆脱它们,因为表格需要它们,但表格提交两次。有谁知道如何解决这个问题?

我看到一些堆栈溢出页面说我应该删除我的assets文件夹中的js文件,但我需要它们用于表单。我还读到将“config.serve_static_assets = false”添加到development.rb将解决问题,但事实并非如此。

提前致谢。

更新:

问题肯定与jquery_ujs.js文件有关。如果我从上面的表单代码中删除它,它不会执行两次。

4 个答案:

答案 0 :(得分:1)

如果有人遇到此问题,请查看您的布局文件。如果它有<%= javascript_include_tag "application" %>个标记的多个实例 你会得到双重提交行动。

答案 1 :(得分:0)

如果您正在使用资产管道,则可能包含application.js,其中已包含您需要执行远程表单所需的所有脚本。

您的第二个副本包含明确的<%= javascript_include_tag "/assets/jquery_ujs.js" %>,因此所有事件处理程序都被绑定了两次。

答案 2 :(得分:0)

我想出了一个hacky方法,但我不确定这是否危险。基本上,我制作了一个jquery_ujs文件的副本,其中有令人不安的部分被注释掉了。主页面仍然调用原始的jquery_ujs文件,但是当使用ajax呈现表单时,将调用该副本。如果您查看query_ujs源代码,我会注释掉该行下的所有内容:

// Submits "remote" forms and links with ajax
这是危险的吗?我是rails上的红宝石,所以我猜测自己与javascript和资产管道有关的事情。我不认为这是最好的答案,所以另一个答案仍然可能被标记为正确。

答案 3 :(得分:0)

就我而言,我已从application.js中删除//= require jquery_ujs,因为我已经拥有//= require rails-ujs。 这解决了我的问题。