1

I am using Ruby on Rails 3.1.1 and the jquery-rails 1.0.16 gem. I have an issue on using a form with :remote => true.

In my view file I have:

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

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

When I click on the Update button and I inspect the Firebug Console, I see that two AJAX HTTP requests are performed instead of one as well as it should be. The same problem happens for all forms in my application that are using :remote => true.

What could be the problem? How to fix it?


Note: If I inspect the DOM it seems that in the current page I do not have duplicate of HTML\CSS id values.

P.S. I: I tried to use different browsers and clear them cache but the problem still occurs.

P.S. II: The problem occurs in development mode in localhost (on my local machine). I have not tried yet if it happens in production mode on the remote machine.


UPDATE I

In my application.js file I had

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

I tried to remove the require jquery_ujs line and now it seems to work until I run the bundle exec rake assets:precompile command and restart the server. Exactly: if I remove the require jquery_ujs line and I do not run the bundle command it works as well as expected; but if then I run the bundle command the AJAX form submission doesn't work "at all"\"anymore".

Maybe the problem is related to the bundle command that generates fingerprinted files... could be that?


UPDATE II

My filesystem related to JavaScript files is:

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

In my app/assets/javascripts/application.js file I have:

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

In my vendor/assets/javascripts/vendor.js file I have:

//= require_directory ./jquery_plugins

If I run the following command

$ 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

in the public/assets/ directory it creates those files

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

If I inspect the page HTML code, I can see the following:

<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>
user12882
  • 4,702
  • 9
  • 39
  • 54

1 Answers1

1

Prior to Rails 3.1, you would include jQuery-ujs by manually adding rails.js to your public/javascripts folder.

With Rails 3.1, you now have a gem 'jquery-rails' line in your Gemfile and a require jquery_ujs line in your app/assets/javascripts/application.js file; there is no need for manually adding the rails.js file because it's already bundled with the gem.

If you upgraded a non-3.1 app to 3.1, you may still have rails.js sitting around, so the UJS stuff is getting run twice. Rather than removing the require line from your application.js file, you should probably just delete the rails.js file instead. (You also may still have the actual jQuery JS file sitting in there too; same thing, it's included automatically by the jquery-rails gem and you can delete it).

UPDATE

I just realized you're precompiling your assets. You don't want to do this in development mode, as when you request /assets/application.js it's probably serving up /public/assets/application.js which includes all the other JS files inside of it. To fix, clear out the public/assets folder and only precompile your assets in production. (See Rails 3.1 remote requests submitting twice)

Community
  • 1
  • 1
Dylan Markow
  • 123,080
  • 26
  • 284
  • 201
  • I've done a search but none of the files that you have mentioned are in directories of my application. I also updated the question with some more information. – user12882 Nov 03 '11 at 15:12
  • If I inspect the HTML code I can see that I do *not* have duplicated of any "core" file that you have mentioned in your answer (see the last part of the updated question for more information). – user12882 Nov 03 '11 at 16:58
  • Just updated my answer, it most likely has to do with precompiling assets in development mode. – Dylan Markow Nov 03 '11 at 17:11
  • In `development` mode on my local machine, I tried to follow the solution proposed in your linked question (that is: 1. to delete the `public/assets` path at all, 2. to restart my server) but I am still getting the problem. Am I forgetting to do something? – user12882 Nov 03 '11 at 17:47
  • Just ask the code you want to see and I will update the question. Anyway, thank for your help. – user12882 Nov 03 '11 at 17:56