1

これは私のモデルクラスです:

class Availability < ActiveRecord::Base
  attr_accessible :beginning_date, :end_date
  validates :beginning_date, :end_date :presence => true

  # custom validators
  validate :dates_cant_be_in_the_past

  def dates_cant_be_in_the_past
    if Date.parse(beginning_date) < Date.today
      errors.add(:beginning_date, "cant be in the past")
    end

    if Date.parse(end_date) < Date.today
      errors.add(:end_date, "cant be in the past")
    end
  end
end

ここで、次の 2 つのことが発生するはずです。最初に、beginning_dateおよびend_date属性の存在を検証し、次にdates_cant_be_in_the_pastバリデーターを実行します。残念ながら、このアプローチは機能しません。フィールドを空のままにするDate.parseと、引数が明らかに空であるため、メソッドは例外をスローします。

デフォルトおよびカスタム検証の順序を定義することは可能ですか? または、プレゼンスバリデーターを自分で実装する必要があるので、次のようにします。

validate :dates_cant_be_blank, :dates_cant_be_in_the_past

ガイドには少なくとも次のように書かれています。

各クラス メソッドに複数のシンボルを渡すことができ、それぞれの検証が登録された順序で実行されます。

少し早いですがお礼を

4

2 に答える 2

0

あなたはこのようなことを試すことができます

class Availability < ActiveRecord::Base
  attr_accessible :beginning_date, :end_date
  validates :beginning_date, :end_date : presence => true

  # custom validators
  validate :valid_dates


  def valid_dates
    if valid_string(beginning_date)
      errors.add(:beginning_date, "Can't be in the past") unless Date.parse(beginning_date) > Date.today
    end

    if valid_string(end_date)
      errors.add(:end_date, "Can't be in the past") unless Date.parse(end_date) > Date.today
    end

  end

  def valid_string(test_value)
    test.value.is_a? String
  end

end
于 2013-04-07T13:56:55.623 に答える