2014-07-14 2 views
1

Я нахожусь в главе 11 учебника Майкла Хартла и не в состоянии следить за пользователями. Я нажимаю кнопку «Далее», но ничего не происходит. Я снова и снова перебирал этот раздел, копировал и вставлял код. Это все еще не работает.Учебник Hartl Невозможно следить за пользователями

Вот код:

relationships_controller.rb

class RelationshipsController < ApplicationController 
before_action :signed_in_user 

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 
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 

create.js.erb

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

destroy.js.erb

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

_follow.html .erb

<%= form_for(current_user.relationships.build(followed_id: @user.id), 
     remote: true) do |f| %> 
<div><%= f.hidden_field :followed_id %></div> 
<%= f.submit "Follow", class: "btn btn-large btn-primary" %> 
<% end %> 

_unfollow.html.erb

<%= form_for(current_user.relationships.find_by(followed_id: @user.id), 
     html: { method: :delete }, 
     remote: true) do |f| %> 
<%= f.submit "Unfollow", class: "btn btn-large" %> 
<% end %> 

_follow_form.html.erb

<% unless current_user?(@user) %> 
<div id="follow_form"> 
<% if current_user.following?(@user) %> 
<%= render 'unfollow' %> 
<% else %> 
<%= render 'follow' %> 
<% end %> 
</div> 
<% end %> 
+0

Можете ли вы опубликовать журнал журнала? – Pavan

+0

Я обнаружил, что я не использовал create in the follow! метод в user.rb. – JohnsWort

ответ

0

Не видя ваши журналы, это игра спекуляции

-

Однако есть число o f вещи для изучения.

Создать

Во-первых, вы должны убедиться, что ваш create действие может фактически выполнять то, что вы хотите. Я заметил, что есть метод .follow! включено:

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 
end 

Поскольку вы используете bang operator, это обычно означает, что он будет выполнять функцию на самом объекте (или во время вызова). Для такой степени, что вам нужно, чтобы иметь метод .follow! экземпляра в вашей User модели

я ожидал бы следующее:

#app/models/user.rb 
Class User < ActiveRecord::Base 
    has_many :relationships 

    def follow!(friend) 
     self.relationships.create({follower_id = friend.id}) 
    end 
end 

-

Forms

Как вам используя form_for, вы должны убедиться, что вы вызываете правильные маршруты. Я замечаю, что Hartl не создает ActiveRecord Object, прежде чем пытаться заполнить form_for - это может вызвать проблему.

Поскольку вы используете partial, я действительно понимаю, почему это было сделано.Тем не менее, это может быть так, что форма не ударять правильный action, или это не посылая Params вы хотите

Хотя я хотел бы остановиться на этом, я не могу не видеть бревна

- -

Ajax

Наконец, вы можете рассмотреть ответ Ajax.

Я заметил, что вы используете метод .js.erb для выполнения действия, когда вы отправили запрос remote. Возможно, функциональность этих файлов неверна?

Это может быть проблема - если вы не видите какой-либо другой вопроса с вашей системой (IE ваших routes и controller проверяет), вы хотите, чтобы гарантировать, что .js.erb файлы не испорчены.

Опять же, это будет выделено в ваших журналах :)

+1

Я обнаружил, что использовал find_by вместо создания для последующего! метод в user.rb. Спасибо за вашу помощь! – JohnsWort

Смежные вопросы