我很确定我正在寻找的是正确使用虚拟属性吗?
不管
以下是我的ActiveRecord的概述:
class User < ActiveRecord::Base
validates :email, uniqueness: { case_sensitive: false }, email: true
validates :username, uniqueness: { case_sensitive: false }
validates :password, confirmation: true
validates :password_confirmation, presence: true
end
相关的架构:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |u|
u.string :email
u.string :username
u.string :password_hash
u.string :salt
u.timestamps
end
end
end
我的目标是能够使用(类似)以下内容初始化新记录:
User.new({"email"=>"emailaddresshere",
"username"=>"usernamehere",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]"})
在所有可爱的验证检查之后,我需要一种方法,但在尝试创建新的DB记录之前,将密码转换为password_hash,以及生成salt。 我知道如何获取哈希和盐,我只是不知道如何能够将一段代码插入到记录创建过程中,以修改所提供的参数。我也不确定如何在不抛出UnknownAttributeError的情况下确保一切正常。
有什么办法吗?我显然可以写一个&#34; def寄存器&#34;手动将所有内容转换为新记录的方法,然后它会使密码和password_confirmation验证无效,因为记录将在它到达User.new()时被转换。
答案 0 :(得分:1)
在您的情况下,您可以使用after_validation
或before_save
回调。
一个例子是:
class User < ActiveRecord::Base
validates :email, uniqueness: { case_sensitive: false }, email: true
validates :username, uniqueness: { case_sensitive: false }
validates :password, confirmation: true
validates :password_confirmation, presence: true
before_save :salt_new_password, :if=>:self.password_changed?
private
def salt_new_password
# self.password = <whatever logic you use>
end
end