NoMethodError - undefined method 'find_by' for []: ActiveRecord :: Relation

 8 months ago
source link: https://www.codesd.com/item/nomethoderror-undefined-method-find-by-for-activerecord-relation.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

NoMethodError - undefined method 'find_by' for []: ActiveRecord :: Relation


I've been following Michael Heartl tutorial to create a follow system but I have a strange error: "undefined method `find_by' for []:ActiveRecord::Relation". I'm using devise for authentication.

My view /users/show.html.erb looks like that:

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

User model '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)

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

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


Relationship model '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


Rails is telling me that the issue is in user model : "relationships.find_by(followed_id: other_user.id)" because mthod is not defined, but I don't understand why ?

I believe find_by was introduced in rails 4. If you are not using rails 4, replace find_by by a combination of where and first.

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

You can also use the dynamic find_by_attribute



I suggest you change your following? method to return a truthy value rather than a record (or nil when no record is found). You can do this by using exists?.

relationships.where(followed_id: other_user.id).exists?

One big advantage of this is it doesn't create any object and just returns a boolean value.

About Joyk

Aggregate valuable and interesting links.
Joyk means Joy of geeK