1

日付が過去のものではないことを検証するカスタム検証関数を備えたモデルがあります。現在、検証は、モデル内の単一フィールド selected_date をチェックするようにハードコーディングされています。カスタム検証にパラメーターを渡して 2 つのフィールドをテストできるように、検証をリファクタリングするにはどうすればよいですか?

class Appointment < ActiveRecord::Base
  attr_accessible :selected_date, :alternate_date

  validates_presence_of :selected_date
  validate :validate_date

  def validate_date
    if selected_date < Date.today
      errors.add(:selected_date, 'Date has passed')
    end
  end
end
4

1 に答える 1

1

ファイル lib/future_validator.rb を作成します。

class FutureValidator < ActiveModel::EachValidator

  def validate_each(object, attribute, value)
    if value < Date.today
      object.errors[attribute] << "has passed"
    end
  end

end

あなたのモデルでは:

validates :selected_date, presence: true, future: true
validates :other_date, presence: true, future: true

この RailsCast: Validations in Rails 3を参照してください。

注: lib ファイルが config/application.rb に自動ロードされていることを確認し、そのファイルを追加した後にサーバーを再起動してください。

于 2012-08-17T20:10:33.877 に答える