ユーザーがサインインするための統合テストを実行しているときに発生するエラーについて、少し混乱しています。トレースの最初の数行を次に示します。
invalid hash
@ /home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/bcrypt-ruby-3.0.1/lib/bcrypt.rb:171:in `initialize'
/home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `new'
/home/benjamin/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.6/lib/active_model/secure_password.rb:58:in `authenticate'
/home/benjamin/projects/LTClone/app/controllers/sessions_controller.rb:9:in `create'
create
したがって、エラーはアクションの次の行から発生しています。
if user && user.authenticate(params[:session][:password])
authenticate
で定義されたメソッドを呼び出しますsecure_password.rb
:
def authenticate(unencrypted_password)
if BCrypt::Password.new(password_digest) == unencrypted_password
...
BCrypt::Password.new
で定義されているメソッドを呼び出しますbcrypt.rb
。
def initialize(raw_hash)
if valid_hash?(raw_hash)
...
else
raise Errors::InvalidHash.new("invalid hash") # line 171
end
end
したがって、何らかの理由で、raw_hash
は で指定された正規表現と一致しません。valid_hash?
これは、password_digest
変数が有効なハッシュではないことを意味します。この回答に基づいて、私が認証しようとしているユーザーには空白または無効なものがあるように見えますが、テストでアクションpassword_digest
を呼び出す前に、でき、ハッシュが出力されます(そしてRubularは正規表現がそれに一致すると言います) . また、作成方法を次のように変更しましたcreate
puts @user.password_digest
valid_hash?
if user && user.password_digest && user.authenticate(params[:session][:password])
本当に存在することを確認するだけです。
だから今、私は完全に困惑しています。私は有効な を持っているようですがpassword_digest
、BCrypt::Password.new
それをそのように認識することを拒否しています。理由を知っている人はいますか?