我有一个通过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文件有关。如果我从上面的表单代码中删除它,它不会执行两次。
答案 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
。
这解决了我的问题。