2011-10-23 16 views
9

私はhas_secure_passwordで遊んでいましたが、問題が発生しました。私のUsersControllerのアクションを作成するための私のテストは の作業ではありませんでした。だから私はコンソールで遊んで始め、パスワードがハッシュに変換されずに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は空白にすることはできませんメッセージを持っていました。

attr_accessor :password 

これは

# 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 

を(secure_password.rbを参照)と呼ばれているから=メソッドパスワードを防ぐため、値だった:私が持っていた問題は、私はuser.rbでこれを設定していたということでした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 

今では完璧に動作します。

関連する問題