undefined метод 'hashed_password' Гибкая веб-разработка с рельсами - PullRequest
0 голосов
/ 04 июля 2011

Я следую итерации 13 разработки Agile Web для входа пользователя.

Я создаю миграцию, чтобы добавить в мою модель пользователя 2 столбца: hashed_password и salt.

  • Творение пользователей работает
  • вход не выполнен, из-за этой ошибки неопределенный метод 'hashed_password' в методе 'authenticate'

Проблема в том, что:

  • В консоли rails я могу получить User.first.hashed_password, что выглядит нормально: -)
  • Я вывел Пользователя, которого я вижу, и это НЕ ноль
  • Я попытался вывести user.hashed_password, как я это делал в консоли rails, но это выдает всегда одну и ту же ошибку:

NoMethodError (неопределенный метод hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>): app/models/user.rb:21:in authenticate ' app / controllers / session_controller.rb: 6: в `create '

Это моя модель пользователя:

require 'digest/sha2'

class User < ActiveRecord::Base
has_and_belongs_to_many :products
has_many :created_products, :class_name => "Product", :foreign_key => :product_id

default_scope :order => "username ASC"


# Attributs pour le login (Livre)
validates :username, :presence => true, :uniqueness => true
validates :password, :confirmation => true
attr_accessor :password_confirmation
attr_reader :password
validate :password_must_be_present

def User.authenticate(name, password)
    logger.debug "---------- Beginning of Authenticate"
    if user = User.where(:username => name)

      logger.debug "utilisateur = #{user.inspect}"   # THIS IS OK AND NOT NIL
      logger.debug "utilisateur hashed PW = #{user.hashed_password}" # ERROR


        if user.hashed_password == encrypt_password(password, user.salt)
            return user
        end
    end
end

def User.encrypt_password(password, salt)
    Digest::SHA2.hexdigest(password + "wibble" + salt)
end

def password=(password)
    @password = password
    if (password.present?)
        generate_salt
        self.hashed_password = self.class.encrypt_password(password, salt)
    end
end


private

    def password_must_be_present
        errors.add(:password, "Mot de passe manquant") unless hashed_password.present?
    end

    def generate_salt
        self.salt = self.object_id.to_s + rand.to_s
    end

end

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

поместите это в вашу модель

   private
    def self.hash_password(password)
       Digest::SHA1.hexdigest(password)
    end 
0 голосов
/ 04 июля 2011

User.where (: username => name) возвращает объект ActiveRecord :: Relation (отсюда и сообщение об ошибке, которое вы видите).Попробуйте изменить свой оператор if на:

if user = User.where(:username => name).first

. При этом будет выбран первый соответствующий пользователь, который будет экземпляром пользователя и будет иметь поле hashed_password.Если ни один пользователь не соответствует, вы получите ноль.

...