我正在开发一个具有两因素身份验证的 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