ActiveRecord验证不使用自定义属性分配方法

时间:2012-09-21 04:07:49

标签: ruby-on-rails validation activerecord

我正在使用双因素身份验证的Rails应用程序。此应用中的User模型具有属性two_factor_phone_number。我有模型验证在保存模型之前该属性存在。

为了确保以正确的格式保存电话号码,我创建了一个自定义属性分配方法,如下所示:

def two_factor_phone_number=(num)
  num.gsub!(/\D/, '') if num.is_a?(String)
  self[:two_factor_phone_number] = num.to_i
end

我正在进行一些验收测试,并且我发现如果此方法在模型中,则忽略/跳过ActiveRecord验证,并且可以在没有设置two_factor_phone_number的情况下创建新模型。

模型代码如下所示:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable,
        :recoverable, :rememberable, :trackable, :validatable,
        :lockable

  attr_accessible :email, :password, :password_confirmation, :remember_me,
                  :first_name, :last_name, :two_factor_phone_number

  validates :first_name,              presence: true
  validates :last_name,               presence: true
  validates :two_factor_phone_number, presence: true

  # Removes all non-digit characters from a phone number and saves it
  #
  # num - the number to be saved
  #
  # Returns the digit-only phone number
    def two_factor_phone_number=(num)
      num.gsub!(/\D/, '') if num.is_a?(String)
      self[:two_factor_phone_number] = num.to_i
    end
end

1 个答案:

答案 0 :(得分:1)

您可以添加格式验证:

validates :two_factor_phone_number, :format => { :with => /[0-9]/,
:message => "Only digits allowed" }

和/或创建另一种方法来设置此属性并在验证之前调用它

before_validation :update_phone_format

def update_phone_format
 ...
end