3

ユーザーがサインインするための統合テストを実行しているときに発生するエラーについて、少し混乱しています。トレースの最初の数行を次に示します。

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は正規表現がそれに一致すると言います) . また、作成方法を次のように変更しましたcreateputs @user.password_digestvalid_hash?

if user && user.password_digest && user.authenticate(params[:session][:password])

本当に存在することを確認するだけです。

だから今、私は完全に困惑しています。私は有効な を持っているようですがpassword_digestBCrypt::Password.newそれをそのように認識することを拒否しています。理由を知っている人はいますか?

4

3 に答える 3

2

ユーザーの「password_digest」列を確認してください。「nil」の場合、このエラーが発生します。すべてのユーザーを単純に削除し、ユーザーが適切に作成されるようにすることをお勧めします。

于 2013-06-04T11:40:12.843 に答える