ActiveRecord在初始化时修改参数

时间:2014-11-06 05:05:23

标签: ruby-on-rails activerecord

我很确定我正在寻找的是正确使用虚拟属性吗?

不管

以下是我的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()时被转换。

1 个答案:

答案 0 :(得分:1)

使用Activerecord Callbacks

在您的情况下,您可以使用after_validationbefore_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