使用AJAX表单时遇到麻烦

时间:2011-11-03 13:09:05

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

我正在使用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 => true的所有表单都会出现同样的问题。

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


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

P.S。我:我尝试使用不同的浏览器并清除缓存但问题仍然存在。

P.S。 II :问题出现在localhost(在我的本地计算机上)的开发模式中。如果在远程机器上以生产模式发生,我还没有尝试过。


更新我

在我的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>

1 个答案:

答案 0 :(得分:1)

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

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

如果您将非3.1应用程序升级到3.1,您可能仍然会有rails.js,因此UJS的内容会运行两次。您可能只需删除require文件,而不是从application.js文件中删除rails.js行。 (你也可能还有真正的jQuery JS文件;同样的事情,它由jquery-rails gem自动包含,你可以删除它。)

<强>更新

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