无法批量分配受保护的属性 - 它是attr_accessor中的大量分配字段

时间:2013-01-08 15:06:23

标签: ruby ruby-on-rails-3 model mass-assignment attr-accessor

  

无法批量分配受保护的属性:password,password_confirmation


这两个字段都没有映射到数据库中,它们只是我想用来启用一些不错的验证的表单中的字段。

这是我的模特课:

class User < ActiveRecord::Base
  attr_accessible :email, :password_hash, :password_salt
  attr_accessor :password, :password_confirmation

  before_save :encrypt_password

  validates_confirmation_of :password
  validates :password, presence: true
  validates :email, presence: true

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end

我的印象是,通过将passwordpassword_confirmation置于attr_accessor方法中,他们会进行大规模分配,但在这里我处理这个小问题。< / p>

有什么建议吗?

这是我的迁移字段,因此您可以查看我的数据库中实际存在哪些字段。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :password_hash
      t.string :password_salt

      t.timestamps
    end
  end
end

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

attr_accessible 指定可以通过质量分配设置的模型属性的白名单。 attr_accessor 创建实例变量(@name)和相应的访问方法来读取它。还创建一个名为name =的方法来设置属性。

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation
  attr_accessor :password

  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates :email, presence: true

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end

答案 1 :(得分:1)

您需要在 attr_accessible

中添加:password_confirmation :密码