Ruby on rails ActiveRecord在初始化时修改参数

Ruby on rails ActiveRecord在初始化时修改参数,ruby-on-rails,activerecord,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, confirmat

我很确定我要找的是虚拟属性的正确使用

不管怎样

以下是到目前为止我的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
我需要一种方法,在所有可爱的验证检查之后,但在尝试创建新的DB记录之前,将密码转换为密码散列,以及生成salt。 我知道如何获取hash和salt,只是不知道如何在记录创建过程中插入一段代码,修改提供的参数。我也不确定如何确保所有这些都能正常工作,而不会出现未知的错误

有办法吗?很明显,我可以编写一个“def register”方法,手动将所有内容转换为一个新记录,但这样做会使密码和密码确认验证无效,因为当记录到达User.new()时,该记录已被转换。

使用

在您的情况下,您可以在验证之后使用
,或者在保存之前使用

例如:

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
class用户:self.password\u是否已更改?
私有的
def salt_新密码
#self.password=
结束
结束

我认为我的问题也源于对ActiveRecord流程的全面了解严重不足。。。总的来说,这似乎是可行的。我将把
password\u hash
字段重命名为just
password
,但在此之前,
password
上会出现未知属性错误。我知道这有点脱离了原始问题的主题,但有没有一种方法可以明确地说不要将其存储在DB中?另外,感谢您提供的参考资料,这当然可以让我澄清一点!啊,找到了<代码>属性访问器显然就是我要找的。我之前看过,但描述它的参考资料做得很差。新资料来源:
User.new({"email"=>"emailaddresshere",
          "username"=>"usernamehere",
          "password"=>"[FILTERED]",
          "password_confirmation"=>"[FILTERED]"})
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