【问题标题】:unknown attribute: password未知属性:密码
【发布时间】:2012-07-31 22:30:40
【问题描述】:

我在登录应用程序时收到错误“未知属性:密码”。它似乎没有保存密码。我是rails新手,有人可以帮我吗?

这是我在运行应用程序时收到的消息。这是模型和控制文件中的代码。 用户控制器中的 ActiveRecord::UnknownAttributeError#create

未知属性:密码

我正在尝试创建一个登录名/密码网络应用程序。运行应用程序时出现以下错误。 未定义的方法encrypt_pasword' app/models/user.rb:32:inpassword=' app/controllers/users_controller.rb:43:in new' app/controllers/users_controller.rb:43:increate'

这是来自控制文件的代码。

require 'digest/sha2'
class User < ActiveRecord::Base
  include ActiveModel::MassAssignmentSecurity

  attr_accessible :name, :password, :password_confirmation, :hashed_password, :salt
  attr_accessor :name
  attr_accessor :salt

  validates :name, :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)
    if user = find_by_name(name)
      if user.hashed_password == encrypt_password(password, user.salt)
        user
      end
    end
  end

  def User.encrypt_password(password, salt)
    Digest::SHA2.hexdigest(password + "wibble" + salt)
  end
  # 'password' is a virtual attribute
  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, "Missing password") unless hashed_password.present?
  end

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

end

这是我的模型文件

require 'digest/sha2'
class User < ActiveRecord::Base
  include ActiveModel::MassAssignmentSecurity

  attr_accessible :name, :password, :password_confirmation, :hashed_password, :salt
  attr_accessor :name
  attr_accessor :salt
  attr_accessor :password

  validates :name, :presence => true, :uniqueness => true
  validates :password, :confirmation => true
  attr_accessor :password_confirmation
  attr_reader  :password

  validate :password_must_be_present

     def encrypt_password
         self.encrypted_password 
    end

       def User.authenticate(name, password)
    if user = find_by_name(name)
      if user.hashed_password == encrypt_password(password, user.salt)
        user
      end
    end
  end

  def User.encrypt_password(password, salt)
    Digest::SHA2.hexdigest(password + "wibble" + salt)
  end
  private 
    def encrypt_password
      self.salt = make_salt if new_record?
      self.encrypted_password = encrypt(password)
    end

  # 'password' is a virtual attribute
  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, "Missing password") unless hashed_password.present?
  end

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

end

【问题讨论】:

  • 首先你可以并且应该将你的类方法声明为def self.encrypt_password 或更正式的class &lt;&lt; self; def encrypt_password; end; end; 下一个问题是为什么encrypt_password 甚至是一个类方法,它不能只是一个私有实例方法?
  • 您能否验证User 是否确实具有password 属性?确认这一点的一个简单方法是从命令行登录到 Rails 控制台,输入rails console,然后输入User。这应该会调出 User 模型并列出与之关联的所有属性。

标签: ruby-on-rails ruby controller


【解决方案1】:

encrypt_pasword 缺少一个 s。

【讨论】:

  • 是的,我确实纠正了错字并添加了 encrypt_password 类。现在我得到了以下错误 ActiveRecord::UnknownAttributeError in UsersController#create unknown attribute: password
  • 嗯,这显然是一个新问题。请检查错误发生在哪一行(在错误消息中说明),然后查看该行代码。如果您当时不知道问题所在,您可以在此处发布该信息,但如果没有这些信息,将很难为您提供帮助。
猜你喜欢
  • 2017-09-04
  • 2023-04-02
  • 2017-10-13
  • 2014-05-28
  • 2018-12-24
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多