Проблемы с использованием форм AJAX - PullRequest
1 голос
/ 03 ноября 2011

Я использую Ruby on Rails 3.1.1 и гем jquery-rails 1.0.16. У меня проблема с использованием формы с :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 : проблема возникает в режиме разработки на локальном хосте (на моей локальной машине). Я еще не пробовал, если это происходит в производственном режиме на удаленной машине.


ОБНОВЛЕНИЕ I

В моем 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 Ответ

1 голос
/ 03 ноября 2011

До Rails 3.1 вы включали бы jQuery-ujs, вручную добавляя rails.js в папку public/javascripts.

С Rails 3.1 теперь у вас есть строка gem 'jquery-rails' в вашем Gemfile и строка require jquery_ujs в вашем app/assets/javascripts/application.js файле; нет необходимости вручную добавлять файл rails.js, потому что он уже связан с гемом.

Если вы обновили приложение не-3.1 до 3.1, у вас все еще может быть rails.js, поэтому UJS запускается дважды. Вместо удаления строки require из файла application.js вам, вероятно, следует просто удалить файл rails.js. (У вас также может быть еще и настоящий jSu-файл jQuery; тоже самое, он автоматически включается в гем jquery-rails, и вы можете удалить его).

UPDATE

Я только что понял, что вы прекомпилируете свои ресурсы. Вы не хотите делать это в режиме разработки, поскольку, когда вы запрашиваете /assets/application.js, возможно, он обслуживает /public/assets/application.js, который включает в себя все остальные файлы JS внутри него. Для исправления очистите папку public/assets и прекомпилируйте только свои ресурсы в производство. (См. Удаленные запросы Rails 3.1, дважды отправляющие )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...