无法批量分配受保护的属性: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
我的印象是,通过将password
和password_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
我在这里缺少什么?
答案 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 和:密码