1

sinatra を使用して [Ryan Bates の「authenticaion from scratch」][1] を構築しようとしていますが、認証が機能しません。「undefined method password_hash」エラーが発生します。

他のすべてが機能しています。特に遅延読み込みについて、datamapper のドキュメントを確認しましたが、有用なものは見つかりませんでした。コードは以下です。私は何の間違いをしているのですか?

main.rb (該当部分のみ)

post "/login" do
  user = User.authenticate params[:email], params[:password]
  if user
    session[:user_id] = user.id
    redirect "/"
  else
    session[:errors] = "No such user or bad password."
    redirect "/login"
  end
end

user.rb

require 'data_mapper'
require 'dm-validations'
require 'bcrypt'

module Kimsin

  DataMapper.setup :default, 'sqlite3:///home/barerd/RProjects/kimsin/users.db' 

  class User 
    attr_accessor :password, :confirm_password

    include DataMapper::Resource

    property :id, Serial
    property :email, String, :required => true, :unique => true, :format => :email_address,
    :messages => { :presence => "We need your email address.", :is_unique => "We already have that email.", :format => "Doesn't look like an email adress.."}
    property :password_salt, String
    property :password_hash, String, :length => 80
    validates_presence_of :password, :confirm_password, :messages => { :presence => "You have to type a password and confirm it." }
    validates_format_of :password, :confirm_password, :with => /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])([\x20-\x7E]){8,40}$/, :messages => { :format => "The password should be 8 to 40 characters long and contain at least one digit, one lowercase and one uppercase letter and one special character." }

    before :save, :encrypt_password

    def self.authenticate email, password
      user = User.all :email.like => email
      if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
        user
      else
        nil
      end
    end

    def encrypt_password
      if password != nil
        self.password_salt = BCrypt::Engine.generate_salt
        self.password_hash = BCrypt::Engine.hash_secret password, password_salt
      end
    end
  end

  DataMapper.finalize
end
4

1 に答える 1

0

を追加するとattr_reader :password_hash解決しました。

于 2012-06-09T09:47:10.170 に答える