在 attr_encrypted 加密之前更改属性

Changing attribute before attr_encrypted encrypts

我想弄清楚如何在 attr_encrypted 进行加密之前更改属性。

我想在将数字保存到加密数据库之前删除数字中的破折号。

attr_encrypted :ssn, key: Rails.application.secrets.secret_encrypt_key
validates :ssn, format: { with: /\d{3}-\d{2}-\d{4}/,
                          message: "SSN must be separated by dashes" },
                allow_nil: true
validates :ssn, length: { is: 11 }, allow_nil: true

before_save :format_ssn

def format_ssn
  return if ssn.nil?
  ssn.delete!("-")
end

这是我目前拥有的。它在 rails 控制台中不起作用。我一辈子都想不出还有什么办法可以做到这一点。我最初尝试使用 setter,但如果我这样做,attr_encrypted 将不再发挥它的魔力。我假设这是因为 attr_encrypted 本身正在重用 setter。

任何关于如何在 attr_encrypted 加密之前格式化的建议将不胜感激。

好的,我明白了。

正在做:

  def format_ssn
    return if ssn.nil?
    self.ssn = ssn.delete!("-")
  end

解决问题