【问题标题】:Trouble on using AJAX forms使用 AJAX 表单的问题
【发布时间】:2011-11-03 13:09:05
【问题描述】:

我正在使用 Ruby on Rails 3.1.1 和 jquery-rails 1.0.16 gem。我在使用带有:remote => true 的表单时遇到问题。

在我的视图文件中,我有:

<%= form_for(@user, :url => user_path(@user), :remote => true) do |f| %>
  ...

  <%= f.submit "Update" %>
<% end %>

当我单击Update 按钮并检查Firebug 控制台 时,我看到执行了两个AJAX HTTP 请求,而不是应该执行的一个。我的应用程序中使用 :remote =&gt; true 的所有表单都会出现同样的问题。

可能是什么问题?如何解决?


注意:如果我检查 DOM,似乎在当前页面中我没有重复的 HTML\CSS id 值。

附注我:我尝试使用不同的浏览器并清除它们的缓存,但问题仍然存在。

附注II:问题出现在本地主机的开发模式下(在我的本地机器上)。如果它发生在远程机器上的生产模式下,我还没有尝试过。


更新我

在我的application.js 文件中

//= require jquery
//= require jquery_ujs
//= require jquery-ui

我试图删除require jquery_ujs 行,现在它似乎可以工作,直到我运行bundle exec rake assets:precompile 命令并重新启动服务器。 完全正确:如果我删除了require jquery_ujs 行并且我确实运行bundle 命令,它的效果与预期一样好;但是如果我运行 bundle 命令,AJAX 表单提交“根本”“不再”工作。

可能问题与生成指纹文件的bundle 命令有关... 可能是这个问题?


更新 II

我与 JavaScript 文件相关的文件系统是:

app/assets/javascripts/
app/assets/javascripts/application.js

lib/assets/javascripts/

vendor/assets/javascripts/
vendor/assets/javascripts/vendor.js
vendor/assets/javascripts/jquery_plugins/plugin1.js
vendor/assets/javascripts/jquery_plugins/plugin2.js
vendor/assets/javascripts/jquery_plugins/....js

在我的app/assets/javascripts/application.js 文件中,我有:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//
//= require_tree .
//
//= require vendor

在我的vendor/assets/javascripts/vendor.js 文件中,我有:

//= require_directory ./jquery_plugins

如果我运行以下命令

$ bundle exec rake assets:precompile
/<MY_USER_PATH>/.rvm/rubies/ruby-1.9.2-p290/bin/ruby /<MY_USER_PATH>/.rvm/gems/ruby-1.9.2-p290/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
/<MY_USER_PATH>/.rvm/rubies/ruby-1.9.2-p290/bin/ruby /U<MY_USER_PATH>/.rvm/gems/ruby-1.9.2-p290/bin/rake assets:precompile:nondigest RAILS_ENV=production RAILS_GROUPS=assets

public/assets/ 目录中创建这些文件

application-b63d5946eebe0c8d46e078ef32299fc5.js
application-b63d5946eebe0c8d46e078ef32299fc5.js.gz
application.js
application.js.gz
manifest.yml
...

如果我检查页面 HTML 代码,我可以看到以下内容:

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_plugins/plugin1.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_plugins/plugin2.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_plugins/....js?body=1" type="text/javascript"></script>
<script src="/assets/vendor.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

【问题讨论】:

  • 您的app/assets/javascripts 文件夹中还有jquery-ujs.js 文件吗?
  • @Dylan Markow - 我更新了问题。如果问题取决于require jquery_ujs 行,您能给我确认一下吗?

标签: javascript ruby-on-rails ajax ruby-on-rails-3 forms


【解决方案1】:

在 Rails 3.1 之前,您可以通过手动将 rails.js 添加到您的 public/javascripts 文件夹来包含 jQuery-ujs。

在 Rails 3.1 中,您现在在 Gemfile 中有一个 gem 'jquery-rails' 行,在您的 app/assets/javascripts/application.js 文件中有一个 require jquery_ujs 行;无需手动添加 rails.js 文件,因为它已经与 gem 捆绑在一起。

如果你将一个非 3.1 的应用升级到 3.1,你可能仍然有rails.js 坐在那里,所以 UJS 的东西会运行两次。与其从application.js 文件中删除require 行,不如直接删除rails.js 文件。 (你也可能还有实际的 jQuery JS 文件在那里;同样的,它被 jquery-rails gem 自动包含,你可以删除它)。

更新

我刚刚意识到您正在预编译您的资产。您不想在开发模式下执行此操作,因为当您请求 /assets/application.js 时,它可能正在提供 /public/assets/application.js,其中包括其中的所有其他 JS 文件。要解决此问题,请清除 public/assets 文件夹并仅在生产环境中预编译您的资产。 (见Rails 3.1 remote requests submitting twice

【讨论】:

  • 我已经进行了搜索,但是您提到的所有文件都不在我的应用程序目录中。我还用更多信息更新了这个问题。
  • 如果我检查 HTML 代码,我可以看到我确实 not 复制了您在答案中提到的任何“核心”文件(请参阅更新问题以获取更多信息)。
  • 刚刚更新了我的答案,很可能与开发模式下的预编译资产有关。
  • 在我本地机器上的development 模式下,我尝试按照您的链接问题中提出的解决方案(即:1. 完全删除public/assets 路径,2. 重新启动我的服务器),但我仍然遇到问题。我是不是忘了做点什么?
  • 只要问你想看的代码,我会更新问题。无论如何,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多