2

I am new to ruby and trying to work through Michael Hartl's http://ruby.railstutorial.org/. I am on chapter 12 and keeping coming upon this error

uninitialized constant User::Relationship

What does this type of error mean? What do you think is likely my mistake?

attr_accessor   :password
  attr_accessible :name, :email, :password, :password_confirmation, :admin

  has_many :microposts, :dependent => :destroy
  has_many :relationships, :foreign_key => "follower_id",
                           :dependent => :destroy
  has_many :following, :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

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, :presence => true,
                   :length => { :maximum => 50 }

  validates :email, :presence  => true,
                    :format    => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }

  validates :password, :presence  => true,
                       :confirmation => true,
                       :length => { :within => 6..40 }

  before_save :encrypt_password 

  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def feed
   # This is preliminary. See Chapter 12 for the full implementation.
     Micropost.where("user_id = ?", id) 
  end

  def following?(followed)
    relationships.find_by_followed_id(followed) 
  end

  def follow!(followed) 
    relationships.create!(:followed_id => followed.id)
  end

  def 
    unfollow!(followed) relationships.find_by_followed_id(followed).destroy
  end

  class << self
    def authenticate(email, submitted_password)
      user=self.find_by_email(email)
      (user && user.has_password?(submitted_password)) ? user : nil     
    end   

    def authenticate_with_salt(id, cookie_salt)
      user = find_by_id(id)
      (user && user.salt == cookie_salt) ? user : nil 
    end 
  end

  private 

  def encrypt_password
    self.salt = make_salt if self.new_record?
    self.encrypted_password = encrypt(self.password)
  end

  def encrypt(string)
    string 
  end

  def encrypt(string)
    secure_hash("#{salt}--#{string}")
  end

  def make_salt
    secure_hash("#{Time.now.utc}--#{password}")
  end

  def secure_hash(string) 
    Digest::SHA2.hexdigest(string)
  end  
end
Nat Ritmeyer
  • 5,634
  • 8
  • 45
  • 58
Spencer
  • 21,348
  • 34
  • 85
  • 121
  • The error is appearing because you are using User::Relationship at a point where Rails has not loaded it yet but it will be difficult to give too much help without some details of your code. Try posting some of the areas where you are trying to use the User::Relationship class/module. – Pete Mar 14 '11 at 21:01

3 Answers3

4

You don't have the relationship_controller.rb code defined yet. Keep working through the chapter, he does explain what needs to be done eventually.

wildrhombus
  • 113
  • 7
3

Ran into this myself. I hadn't added the Relationships controller (app/controllers/relationships_controller.rb) which you can find at 11.34. Once that's added the error will disappear.

rails_newbie
  • 53
  • 1
  • 10
2

It sounds like maybe you didn't update the User model as specified in Listing 12.11.

Specifically, make sure your User class has this code:

has_many :relationships, :foreign_key => "follower_id",
                       :dependent => :destroy
Anthony Lewis
  • 304
  • 1
  • 5