Кнопка не обновляется в Ajax - Rails Tutorial 3 в §12.2.5

Я прохожу через Rails Tutorial Майклом Хартлом и ударяю небольшую хватку в §12.2.5, где мы должны создать рабочую кнопку с Ajax. Я знаю, что код верен (я закончил копирование его непосредственно из книги и три раза перепечатывал его), и я зеленый. Но на самом деле это не работает!

В этой части урока мы меняем обычную кнопку отправки формы для работы с Ajax, чтобы вся страница не "обновлялась" (действительно, перенаправлялась на ту же страницу), а вместо этого просто кнопка и соответствующая боковая панель обновление элемента. Проблема заключается в том, что кнопка не перезагружается автоматически при нажатии, поскольку я ожидаю. Он перезагружается при обновлении страницы. Если я отключу JS в своем браузере, он вернется - как и следовало ожидать - к HTML-версии, которая вызывает перенаправление и "обновляет" всю страницу. Если вам интересно, я попытался обновить страницу, и я попробовал Firefox, Safari и Chrome и Chrome в инкогнито. Я отключил и перезапустил сервер rails, spork и autotest. И я переписал весь код, а затем скопировал весь код книги. Все еще в тупике.

Итак, несмотря на то, что тест зеленый, у меня есть некорректно работающая функция. Может быть, там что-то мне не хватает, и вы можете помочь мне найти его? Возможно, мне не хватает драгоценного камня, связанного с javascreipt, драгоценного камня Ajax...

Соответствующие части кода:

relationships_controller.erb:

class RelationshipsController < ApplicationController
  before_filter :authenticate

  def create
@user = User.find(params[:relationship][:followed_id])
current_user.follow!(@user)
respond_to do |format|
  format.html { redirect_to @user }
  format.js
end

конец

  def destroy
@user = Relationship.find(params[:id]).followed
current_user.unfollow!(@user)
respond_to do |format|
  format.html { redirect_to @user }
  format.js
end
end
end

_follow.html.erb:

<% = form_for (current_user.relationships.                           build (: follow_id = > @user.id),                           : remote = > true) do | f | % > <% = f.hidden_field: follow_id% >
<% = f.submit "Follow" % > <% end% >

_unfollow.html.erb:

<%= form_for(current_user.relationships.find_by_followed_id(@user),
         :html => { :method => :delete },
         :remote => true) do |f| %>

<% end% >

create.js.erb

$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')

destroy.js.erb

$("follow_form").update("<%= escape_javascript(render('users/follow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')

Я также убедился, что эта строка включена в application.html.erb

<%= javascript_include_tag :defaults %>

Если вам нужно что-то еще, чтобы оценить ситуацию, спросите, и я отвечу с обновлением.

ТИА

Ответ 1

какую версию рельсов вы используете? Если его 3.1 вы должны изменить

create.js.erb:

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')

и destroy.js.erb:

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')

(Обратите внимание на дополнительные #) На последней главе учебника заметки о переходе на рельсы 3.1

Ответ 3

Я использую Rails 3.1.1 и имел ту же проблему, что и в руководстве Rails 3.0. В обновлении версии Rails отошел от Prototype и начал использовать jQuery. Чтобы исправить старую версию javascript, мне пришлось обновить файл create/destroy.js.erb.

Вы можете прочитать об этом в глава 13. Это сводится к добавлению "#" перед вашим идентификатором тега и замене вызова ".update" на ".html".

Ответ 4

Я ударился головой об одном и том же вопросе. У меня пока нет решения, но я думал, что смогу переместить мяч вперед с некоторыми из того, что я пробовал.

Скорее всего, это так. В попытке упростить вещи я попытался исключить сам код jQuery. Для этого я использовал панель Safari Inspect Element/scripts для проверки скриптов на странице.

Я решил пойти с безвредным

$('title').text("Create")

Помещая это консоль Safari, измените заголовок. Ввод его в мои файлы create.js.erb и my destroy.js.erb не работает (когда я нажимаю кнопку follow/unfollow). Мои журналы показывают, что вызываются соответствующие отношения /destroy.js.erb, но элемент не обновляется (и страница не перезагружается).

Rendered layouts/_stylesheets.haml (3.3ms)
Rendered layouts/_header.haml (6.1ms)
Rendered layouts/_footer.haml (3.8ms)
Rendered relationships/destroy.js.erb within layouts/application (34.8ms)
Completed 200 OK in 132ms (Views: 39.0ms | ActiveRecord: 1.3ms)

Это последнее, что нужно загрузить. Мой relationship_controller такой же, как и выше. Мои формы такие же, как и книга (но в haml), и я заменил haml тем, что опубликовано на ветке hartl github haml.

Итак, я полагаю, что файлы create.js.erb и destory.js.erb загружаются, но не выполняются по какой-либо причине. Есть ли у кого-нибудь идеи, что попробовать рядом, чтобы диагностировать/разрешать это?

Спасибо,

Dave

Ответ 5

Недавно у меня была эта проблема с Rails 4

запустите веб-сервер, нажмите "follow/unfollow", затем вернитесь к журналам вашего веб-сервера

найти ошибку

У меня был идентификатор ошибки рендеринга NIL

потому что я обновил переменную @user в отношениях_controller.erb для конца кода, но НЕ в первой строке, где я определил ее

def create   Пользователь = User.find(PARAMS [: followed_id])   current_user.follow(пользователь)   reply_to do | формат |     format.html {redirect_to @user}     format.js   конец конец

с

def create   @USER = User.find(PARAMS [: followed_id])   current_user.follow(@user)   reply_to do | формат |     format.html {redirect_to @user}     format.js   конец конец

то же самое снова для destroy - так обновите все экземпляры пользователя с помощью @user

веселит