2011-10-23 64 views
9

我一直在玩弄has_secure_password,並且遇到了問題。我的用戶控制器中的創建操作測試不是 正在工作 通過。所以我開始在控制檯中玩耍,並意識到密碼沒有被轉換爲has並保存在password_digest字段中。Rails 3.1.1 has_secure_password摘要不能爲空

當我嘗試從控制檯創建用戶時,會發生以下情況。

irb(main):031:0> u = User.new(:email => "[email protected]", :password => "test", :password_confirmation => "test") 
=> #<User id: nil, email: "[email protected]", password_digest: nil, created_at: nil, updated_at: nil> 
irb(main):032:0> u.save 
=> false 
irb(main):033:0> u.errors 
=> #<ActiveModel::Errors:0x00000100cde500 @base=#<User id: nil, email: "[email protected]", password_digest: nil, created_at: nil, updated_at: nil>, @messages={:password_digest=>["can't be blank"]}> 

我不知道我在做什麼錯。它看起來像password_digest屬性永遠不會被分配。如果我創建一個沒有屬性的用戶對象並單獨分配每個屬性,我會得到相同的錯誤。

這裏是我的模型

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :email, :password, :password_confirmation 
end 

感謝提前的幫助。

亞歷克斯·謝諾伊

回答

0

我做了一個簡單的例子,如預期的工作。也許你在你的配置中有一些與此有關的東西。我簡單的測試:

$ rails new test 
$ cd test 
$ rails g model user name:string password_digest:string 
$ rake db:migrate 
$ vim app/model/user.rb 

添加

has_secure_password 
attr_accessible :name, :password, :password_confirmation 

保存並退出

$ rails c 

Loading development environment (Rails 3.1.1) 
ruby-1.9.2-p290 :001 > u = User.new(:name => "[email protected]", :password => "test", :password_confirmation => "test") 
=> #<User id: nil, name: "[email protected]", password_digest: "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZ...", created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :002 > u.save 
Binary data inserted for `string` type on column `password_digest` 
    SQL (51.4ms) INSERT INTO "users" ("created_at", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00], ["name", "[email protected]"], ["password_digest", "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZSP9S7FtUy"], ["updated_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00]] 
=> true 
10

我有同樣的症狀,該password_digest不能爲空的消息。我的問題是,我已經設置該在user.rb:

attr_accessor :password 

這防止方法口令=被調用(參見secure_password.rb)

# Encrypts the password into the password_digest attribute. 
    def password=(unencrypted_password) 
    @password = unencrypted_password 
    unless unencrypted_password.blank? 
     self.password_digest = BCrypt::Password.create(unencrypted_password) 
    end 
    end 

因而值爲從來沒有爲password_digest設置。

對我來說,修復是刪除attr_accessor行。

2

我有一個非常類似的問題。我會節省用戶,但password_digest總是nil。對我來說,那是因爲我在我的模型有以下代碼順序:

attr_accessible :name, :password, :password_confirmation 
has_secure_password 

我把它改爲:

has_secure_password 
attr_accessible :name, :password, :password_confirmation 

現在,它完美的作品。