undefined方法'hashed_pa​​ssword'使用rails进行敏捷Web开发

时间:2011-07-04 11:36:38

标签: ruby-on-rails login agile

我正在关注Agile Web开发的迭代13,用户登录。

我创建了一个迁移,为我的用户模型添加了2列:hashed_pa​​ssword和salt。

  • 创建用户工作
  • 登录失败,由于此错误,方法'authenticate'中的未定义方法'hashed_pa​​ssword'

问题在于:

  • 在rails控制台中,我可以获取User.first.hashed_pa​​ssword,看起来没问题: - )
  • 我输出了我真实的用户,并且它不是
  • 我尝试输出user.hashed_pa​​ssword,就像我在rails控制台中所做的那样,但是它总是抛出相同的错误:

NoMethodError(未定义方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>): app/models/user.rb:21:in authenticate'   app / controllers / sessions_controller.rb:6:在'create'

这是我的用户模型:

require 'digest/sha2'

class User < ActiveRecord::Base
has_and_belongs_to_many :products
has_many :created_products, :class_name => "Product", :foreign_key => :product_id

default_scope :order => "username ASC"


# Attributs pour le login (Livre)
validates :username, :presence => true, :uniqueness => true
validates :password, :confirmation => true
attr_accessor :password_confirmation
attr_reader :password
validate :password_must_be_present

def User.authenticate(name, password)
    logger.debug "---------- Beginning of Authenticate"
    if user = User.where(:username => name)

      logger.debug "utilisateur = #{user.inspect}"   # THIS IS OK AND NOT NIL
      logger.debug "utilisateur hashed PW = #{user.hashed_password}" # ERROR


        if user.hashed_password == encrypt_password(password, user.salt)
            return user
        end
    end
end

def User.encrypt_password(password, salt)
    Digest::SHA2.hexdigest(password + "wibble" + salt)
end

def password=(password)
    @password = password
    if (password.present?)
        generate_salt
        self.hashed_password = self.class.encrypt_password(password, salt)
    end
end


private

    def password_must_be_present
        errors.add(:password, "Mot de passe manquant") unless hashed_password.present?
    end

    def generate_salt
        self.salt = self.object_id.to_s + rand.to_s
    end

end

2 个答案:

答案 0 :(得分:0)

User.where(:username =&gt; name)返回一个ActiveRecord :: Relation对象(因此您看到的错误消息)。尝试将if语句更改为:

if user = User.where(:username => name).first

这将设置第一个匹配用户,该用户将是User的实例,因此将具有hashed_pa​​ssword字段。如果没有用户匹配,你将获得零。

答案 1 :(得分:0)

把它放在你的模型中

   private
    def self.hash_password(password)
       Digest::SHA1.hexdigest(password)
    end