0

2 要素認証を使用する 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
4

1 に答える 1

1

フォーマット検証を追加できます:

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

および/またはこの属性を設定し、検証前に呼び出す別のメソッドを作成します

before_validation :update_phone_format

def update_phone_format
 ...
end
于 2012-09-21T04:29:34.010 に答える