2011-07-04 44 views
0

我正在關注敏捷Web開發的迭代13,以供用戶登錄。未定義方法'hashed_pa​​ssword'使用rails的敏捷Web開發

我創建了一個遷移,將2列添加到我的用戶模型:hashed_pa​​ssword和salt。

  • 用戶的創建工作
  • 登錄失敗,因方法 '認證'

問題是這樣的錯誤未定義的方法 'hashed_pa​​ssword' 謂:

  • 在軌控制檯,我可以獲取User.first.hashed_pa​​ssword,什麼似乎確定:-)
  • 我輸出的用戶,我fecth,它不是無
  • 我試圖輸出user.hashed_pa​​ssword如我在軌道控制檯做,但始終引發相同的錯誤:

NoMethodError(未定義的方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>): app/models/user.rb:21:in的authenticate」 應用程序/控制器/ sessions_controller.rb:6:在'創造」

這是我的用戶模型:

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 

回答

0

User.where(:用戶名=>名稱)返回一個ActiveRecord :: Relation對象(因此你所看到的錯誤消息)。試着改變你的if語句:

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

,將設置採取的第一個匹配的用戶,這將是用戶的一個實例,因此將有一個hashed_pa​​ssword字段。如果沒有用戶匹配,你會得到零。

+0

事實上,這是它...爲什麼Rails的不採摘收集的只是第一個對象時,尺寸爲1? (也許對於導軌4 ;-)) –

0

把這個模型中的

private 
    def self.hash_password(password) 
     Digest::SHA1.hexdigest(password) 
    end 
相關問題