2014-03-13 17 views
0

通常當我們創建一個模型時,比如User,其屬性與數據庫字段匹配。例如,如果我的相應數據庫表users_development具有字段namescore,那麼當創建User類的實例時,我只需鍵入user = User.create(:name => "MyName", :score => 85)Devise和User.create

現在,設計創造了一個遷移文件,包括場emailencrypted_password,但我看不到現場password(這是相當邏輯從安全角度)。

雖然通過論壇帖子看,我看到很多例子,如User.create(:email =>"[email protected]", :password => "foo")。那麼,password從哪裏來?這不是表users_development的字段。幕後發生了什麼?我瀏覽了關於http://rubydoc.info/github/plataformatec/devise/master/Devise的文檔,但找不到任何解釋。

回答

3

User.create(:email => "[email protected]", :password => "foo")不直接創建具有這些確切字段的數據庫記錄。相反,它在參數散列中爲每個對使用public_send("#{k}=", v)。因此,其實它做這樣的事情在內部:從色器件的源代碼

def password=(new_password) 
    @password = new_password 
    self.encrypted_password = password_digest(@password) if @password.present? 
end 
+0

非常感謝!這很有幫助。 – fade2black

+0

這沒有記錄。我想我將不得不挖掘源代碼來更好地理解Devise。無論如何,這將是一個很好的練習:-) – fade2black

2

This method

user = User.new 
user.email = "[email protected]" 
user.password = "foo" 
user.save 

即使你沒有password數據庫字段,設計的DatabaseAuthenticatable module adds a password= method,其更新encrypted_password場訣竅:

# Generates password encryption based on the given value. 
def password=(new_password) 
    @password = new_password 
    self.encrypted_password = password_digest(@password) if @password.present? 
end 

當調用創建,更新屬性,構建等,鋼軌將嘗試調用每個字段的方法field=,所以當你通過:password => 'foo'create它會做這樣的事情:

user = User.new 
user.password = 'foo' 
user.save 

下面這個方法允許與非散列密碼,建立模型,而是存儲在散列密碼數據庫。

+0

非常感謝!這很有幫助。 – fade2black

相關問題