Исключение «Ajax не найден» — является ли Rails по умолчанию прототипом по ошибке?

#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. Используйте ручной процесс.