#jquery #ruby-on-rails #ruby-on-rails-3
#jquery #ruby-on-rails #ruby-on-rails-3
Вопрос:
Я пытаюсь создать страницу, которая показывает список задач и позволяет пользователю обновлять статус задачи, устанавливая флажок.
Когда я запускаю страницу в браузере и нажимаю на флажок, я получаю исключение Javascript «
Ошибка неперехваченной ссылки: Ajax не определен (анонимная функция) 2:96 onclick
Вот код, который у меня есть в моем файле _task.html.erb:
<%= check_box_tag "id", "id", task.done,
:onclick => remote_function(
:update => "task",
:url => { :action => :update },
:with => "'done=true'",
:complete => "alert('hi')" ) %>
Почему я получаю это исключение, Ajax не определен?
Я переустановил rails jquery, убедитесь, что есть rails.js и jquery.js в папке javascripts и подтвердил, что они загружаются в HTML, см. Ниже:
<script src="/javascripts/jquery.js?1303396383" type="text/javascript"></script>
<script src="/javascripts/rails.js?1303562965" type="text/javascript"></script>
<script src="/javascripts/application.js?1301606933" type="text/javascript"></script>
<script src="/javascripts/jquery.purr.js?1302145859" type="text/javascript"></script>
<script src="/javascripts/best_in_place.js?1302150372" type="text/javascript"></script>
Кто-то опубликовал комментарий, в котором говорится, что «Ajax» с большой буквы A — это функция прототипа, а не функция rails. Мое приложение каким-то образом настроено на попытку использовать Prototype, а не rails? Какие файлы мне нужно изменить, чтобы исправить это?
Я только что попытался изменить config / application.rb и раскомментировал эту строку:
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
Похоже, тоже не сработало. Есть идеи?
Большое спасибо за вашу помощь.
Ответ №1:
remote_function
как и большинство RJS, использует Prototype напрямую и не является частью концепции UJS. Помощники Prototype всегда доступны в приложении Rails (до Rails 3.1), но создаваемый ими JavaScript доступен только для прототипов и не будет работать, если вы также не используете библиотеку Prototype JavaScript.
В вашем примере вы используете jQuery, а не Prototype. Если вы хотите использовать jQuery, вам следует выписать ожидаемый JavaScript или написать свой собственный remote_function
помощник.
Комментарии:
1. Вы правы. Я добавил prototype.js и это начало работать. Обновится до rails 3.1, как только он станет стабильным.
2. Чтобы уточнить, Rails 3.1 установит jQuery по умолчанию. Я полагаю, что это также переместило бы помощников прототипа (
ActionView::Helpers::PrototypeHelper
модуль) в отдельный gem. Если вы хотите использовать помощники Prototype, такие какremote_function
, вам придется предпринять дополнительные шаги для использования Prototype в Rails 3.1. У вас также есть возможность просмотретьremote_function
исходный код и написать что-то подобное, что работает поверх jQuery.
Ответ №2:
Потому что вы не включаете библиотеки javascript по умолчанию. Загляните в свой файл макета, и вам нужна такая строка в заголовке (я предполагаю, что ERB):
<%= javascript_include_tag :defaults %>
И убедитесь, что либо prototype, либо jquery существуют в public/javascripts
и rails.js
также.
Обновить
В комментарии вы указали, что используете jquery, но в вашей ошибке упоминается заглавная буква — «Ajax», которая является именем прототипа.
Чтобы получить правильный rails.js следуйте этим инструкциям
Комментарии:
1. Я включаю все, и все файлы находятся в папке JS. <%= javascript_include_tag «jquery-1.4.4.min», «rails», «jquery.purr», «best_in_place», «application» %>
2. Я добавил строку в вашем ответе к той, которая у меня уже была, это не сработало. Вот содержимое моей папки javascripts: application.js, best_in_place.js, controls.js, dragdrop.js, effects.js, jquery-1.4.4.min.js, jquery.purr.js, prototype.js и rails.js
3. Я внес изменения в Gemfile, как описано в вашей ссылке, запустил bundle install, а затем запустил: $ rails генерирует jquery: install. Я продолжаю получать ту же ошибку, и она по-прежнему с большой буквы A. Есть идеи?
4. Это все, что включает в себя мой JS: <%= javascript_include_tag «jquery-1.4.4.min», «rails», «jquery.purr», «best_in_place», «application» %> <%= javascript_include_tag:defaults %>
5. Проблема в
rails.js
файле, это все еще прототип, процесс jquery-ujs работает, но иногда завершается сбоем из-за SSL в github. Используйте ручной процесс.