4
validates :place_id, :title, :level, :start_at, :end_at, :presence => true
validate :event_takes_place_in_one_day, :event_is_not_in_past

def event_takes_place_in_one_day
    binding.pry
    self.start_at.day == self.end_at
end

そしてバン!エラー、start_at または end_at が nil の場合。

undefined method `to_datetime' for nil:NilClass
-
app/models/meeting.rb:22:in `cover?'
app/models/meeting.rb:22:in `event_is_not_in_past'
app/controllers/meetings_controller.rb:18:in `create'

これをカスタムバリデータで実装することもできますが、クラスごとにバリデータが1つしかないため、そうではないと思います.3つのチェックに対して3つのクラスを実行する必要がありますね。

Ps

アプリケーションには、会議の開始と終了をそれぞれ示す start_at と end_at DateTime タイプの属性を持つ会議モデルがあります。次のロジックを実装する必要があります start_at < end_at (終了より後に開始する) start_at.day == end_at.day (会議は 1 日以内に終了します) また、会議は当月のみ作成できます。

4

1 に答える 1

1

nil チェックはうまくいきますか?

def event_takes_place_in_one_day
  #only execute if start_at & end_at is not nil
  unless self.start_at.nil? || self.end_at.nil?
    binding.pry
    self.start_at.day == self.end_at 
  end
end
于 2012-10-21T03:48:49.667 に答える