attr_encryptor gem仅在生产中失败

时间:2014-08-07 13:00:37

标签: ruby-on-rails encryption heroku

我在我的应用中使用attr_encryptor gem。它在开发过程中顺利运行但在生产上失败(Heroku)。我得到的错误是:

  

Mysql2 ::错误:字段' encrypted_ssn'没有默认值

这告诉我attr_encryptor甚至没有尝试将加密值插入数据库。这是我的型号代码:

class MerchantProfile < ActiveRecord::Base
  after_initialize :init
  belongs_to :user
  validates_uniqueness_of :user
  validates :phone, presence: true, format: /\A[\(\)0-9\- \+\.]{10,20}\z/
  validates :date_of_birth, presence: true
  validates :ssn, presence: true, format: /\d{3}-?\d{2}-?\d{4}/
  validates :account_number, presence: true
  validates :routing_number, presence: true
  before_validation :check_sensitive_fields

  SENSITIVE_ATTRIBUTES = %i(ssn account_number routing_number)
  SENSITIVE_ATTRIBUTES.each { |attr| attr_encryptor attr, key: Rails.configuration.database_field_encryption_key }

  def init
    self.date_of_birth ||= Time.zone.today
  end

  def check_sensitive_fields
    return unless persisted?
    SENSITIVE_ATTRIBUTES.each do |attr|
      if object_value_matches_database_value?(attr)
        assign_attributes(attr => value_from_database(attr))
      end
    end
  end

  def object_value_matches_database_value?(attr)
    if new_record?
      raise "#{self.class.name} must be saved before #{attr} values can be checked."
    end
    masked(attr) == SensitiveValue.new(value_from_database(attr)).mask
  end

  def value_from_database(attr)
    self.class.find(id).send(attr)
  end

  def masked(attr)
    SensitiveValue.new(send(attr) || "").mask
  end

  def should_mask?(attr)
    persisted? and object_value_matches_database_value?(attr)
  end

  def masked_if_appropriate(attr)
    should_mask?(attr) ? masked(attr) : send(attr)
  end
end

显然,宝石正在加载正常,因为我正在进行的attr_encryptor调用工作正常。由于某种原因,宝石只是不起作用。

知道会发生什么事吗?

1 个答案:

答案 0 :(得分:0)

我重新启动了Heroku,现在它可以工作了。我认为Heroku会在您进行部署时自动重启。