【问题标题】:undefined method 'hashed_password' Agile Web development with rails未定义的方法 'hashed_pa​​ssword' 使用 Rails 进行敏捷 Web 开发
【发布时间】:2011-07-04 11:36:37
【问题描述】:

我正在关注敏捷 Web 开发的第 13 次迭代,用于用户登录。

我创建了一个迁移来向我的用户模型添加 2 列:hashed_pa​​ssword 和 salt。

  • 用户创作作品
  • 登录失败,由于此错误未定义方法 'hashed_pa​​ssword' in method 'authenticate'

问题是:

  • 在 Rails 控制台中,我可以获取 User.first.hashed_pa​​ssword,看起来没问题 :-)
  • 我输出了我喜欢的用户,它不是零
  • 我尝试像在 rails 控制台中那样输出 user.hashed_pa​​ssword,但总是抛出相同的错误:

NoMethodError (未定义方法hashed_password' for #<ActiveRecord::Relation:0x00000003e6c3c0>): app/models/user.rb:21:inauthenticate' app/controllers/sessions_controller.rb:6:in `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

【问题讨论】:

    标签: ruby-on-rails login agile


    【解决方案1】:

    User.where(:username => name) 正在返回一个 ActiveRecord::Relation 对象(因此您会看到错误消息)。尝试将您的 if 语句更改为:

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

    这将设置第一个匹配的用户,这将是 User 的一个实例,因此将有一个 hashed_pa​​ssword 字段。如果没有用户匹配,你将得到 nil。

    【讨论】:

    • 确实,就是这样...为什么当大小为 1 时 Rails 不选择集合的第一个对象? (也许适用于 rails 4 ;-))
    【解决方案2】:

    把它放到你的模型中

       private
        def self.hash_password(password)
           Digest::SHA1.hexdigest(password)
        end 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多