2011-11-03 109 views
1

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

在我看来,文件我有:

<%= 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:本地主机(在本地计算机上)的开发模式中出现问题。如果发生在远程计算机上的生产模式中,我还没有尝试过。


更新我

在我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命令有关......可能是那个?


UPDATE 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 

如果我在public/assets/目录中运行以下命令

$ 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 

它创建这些文件

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> 
+0

您的'app/assets/javascripts'文件夹中是否还有'jquery-ujs.js'文件? –

+0

@Dylan Markow - 我更新了问题。如果问题依赖于'require jquery_ujs'行,你能否给我一个确认? – user12882

回答

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文件,因为它已经与宝石捆绑在一起。

如果您将非3.1应用程序升级到3.1,您可能仍然有rails.js左右,所以UJS的东西正在运行两次。而不是从application.js文件中删除require行,而应该删除rails.js文件。 (您也可能还有实际的jQuery JS文件;同样的事情,它会自动包含在jquery-rails宝石中,您可以删除它)。

UPDATE

我才意识到你是预编译你的资产。你不想在开发模式下这样做,因为当你请求/assets/application.js它可能会提供/public/assets/application.js,其中包括其中的所有其他JS文件。要修复,请清除public/assets文件夹,并仅在生产环境中预编译您的资产。 (请参阅Rails 3.1 remote requests submitting twice

+0

我已经完成搜索,但没有提到的文件都在我的应用程序的目录中。我还用更多的信息更新了这个问题。 – user12882

+0

如果我检查了HTML代码,我可以看到我*没有重复您在答案中提到的任何“核心”文件(有关更多信息,请参阅更新问题的最后一部分)。 – user12882

+0

刚刚更新了我的答案,它很可能与开发模式下的预编译资产有关。 –