2013-07-19 10 views
7

Ich habe Michael Heartl Tutorial folgen, um ein Follow-System zu erstellen, aber ich habe einen seltsamen Fehler: "undefined Methode` find_by 'für []: ActiveRecord: :Beziehung". Ich verwende ein Gerät zur Authentifizierung.NoMethodError - undefined Methode 'find_by' für []: ActiveRecord :: Relation

Meine Ansicht /users/show.html.erb sieht wie folgt aus:

. 
. 
. 
<% if current_user.following?(@user) %> 
    <%= render 'unfollow' %> 
<% else %> 
    <%= render 'follow' %> 
<% end %> 

User-Modell 'models/user.rb':

class User < ActiveRecord::Base 
devise :database_authenticatable, :registerable, :recoverable, :rememberable,  :trackable, :validatable 

has_many :authentications 
has_many :relationships, foreign_key: "follower_id", dependent: :destroy 
has_many :followed_users, through: :relationships, source: :followed 
has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy 
has_many :followers, through: :reverse_relationships, source: :follower 

    def following?(other_user) 
     relationships.find_by(followed_id: other_user.id) 
    end 

    def follow!(other_user) 
     relationships.create!(followed_id: other_user.id) 
    end 

    def unfollow!(other_user) 
     relationships.find_by(followed_id: other_user.id).destroy 
    end 

end 

Relationship-Modell ‚models/relationship.rb ‚:

class Relationship < ActiveRecord::Base 

    attr_accessible :followed_id, :follower_id 

    belongs_to :follower, class_name: "User" 
    belongs_to :followed, class_name: "User" 

    validates :follower_id, presence: true 
    validates :followed_id, presence: true 

end 

Rails sagt mir, dass das Problem in Benutzermodell ist: "relationships.find_by (followed_id: other_user.id)", weil m thod ist nicht definiert, aber ich verstehe nicht warum?

Antwort

22

Ich glaube find_by wurde in Schienen 4. eingeführt Wenn Sie nicht Schienen 4, ersetzen find_by durch eine Kombination von where und first verwenden.

relationships.where(followed_id: other_user.id).first 

Sie können auch verwenden, die dynamische find_by_attribute

relationships.find_by_followed_id(other_user.id) 

ASIDE:

Ich schlage vor, Sie following? Methode zu ändern, um einen truthy Wert zurückzukehren, anstatt einen Datensatz (oder null, wenn kein Datensatz ist gefunden). Sie können dies tun, indem Sie exists? verwenden.

Ein großer Vorteil davon ist, dass es kein Objekt erstellt und nur einen booleschen Wert zurückgibt.

+0

Arbeiten nutzen, danke! Und du hast Recht für booleschen Wert, es ist viel besser. – titibouboul

2

können Sie

relationships.find_by_followed_id(other_user_id) 

oder

relationships.find_all_by_followed_id(other_user_id).first 
Verwandte Themen