2

フォームのフィールドの1つを検証するバリデーターがあります。クラス付きフィールドの戻り値ActiveSupport::TimeWithZone

validate :begins_at_not_in_past

def begins_at_not_in_past
    return unless self.state == 'Scheduled'
    if self.begins_at != nil && self.begins_at < (Time.now - 1.hour)
       errors.add(:begins_at, 'Action cannot begin in past')
      false
    end

end

検証に失敗するとエラーが表示されますが、フォームのデータが無効であってもデータベースに新しいレコードが作成されます。どこで間違えましたか?

4

2 に答える 2

4

次の行が必要です。そうしないと、オブジェクトにエラーが追加されません。したがって、errors.add を含む次の行を追加します。

validate :begins_at_not_in_past

def begins_at_not_in_past
  return unless self.state == 'Scheduled'
  if self.begins_at != nil && self.begins_at < (Time.now - 1.hour)
    errors.add(:begins_at, 'Action cannot begin in past')
    errors[:base] << 'Correct errors'  # Rails 2.3.X errors.add_to_base('msg')
    false
  end
end

コントローラー内: #valid? を呼び出した場合にのみ検証が実行されます。方法

if obj.valid?
  #do something
else
  flash[:error] = obj.errors.full_messages.join('<br/>')
end
于 2013-01-29T16:28:19.360 に答える
1

あなたのモデルで、試してください

validates :field_name, :begins_at_not_in_past => true

バリデーターからの許容可能な戻り値を指定しない場合、モデルはそれを検証の失敗と見なさない場合があります。

于 2013-01-29T16:35:39.593 に答える