Проверка Rails не дает сбоя

У меня есть следующая проверка на поле модели:

validates :invoice_date, :presence => true, :unless => Proc.new { |invoice| invoice.invoice_date.future? }

Это выглядит довольно просто, но это не работает. Нет ошибки, если дата в будущем. И Proc действительно возвращается false в таком случае.

Есть идеи, почему не отображается ошибка валидации?

3 ответа

Решение
validates :invoice_date, :presence => true
validate :is_future_invoice_date?

private
 def is_future_invoice_date?
   if invoice_date.future?
     errors.add(:invoice_date, 'Sorry, your invoice date is in future time.')
   end
end

Присутствие true просто гарантирует, invoice_date должен присутствовать. для проверки, является ли дата будущей или нет, мы указали собственный метод проверки.(is_future_invoice_date?) Этот метод добавит сообщение об ошибке в наш атрибут invoice_date, если дата имеет будущую дату.

Более подробная информация здесь: http://guides.rubyonrails.org/active_record_validations.html

Условие "если" предназначено для принятия решения о том, должна ли валидация выполняться или нет, а не о том, будет ли она успешной или неудачной. Таким образом, ваша проверка по сути говорит: "проверить наличие invoice_date, если только invoice_date находится в будущем, и в этом случае не проверять его наличие" (что не имеет смысла)

Похоже, вы хотите две проверки, ограждение присутствия и даты.

validate :invoice_date_in_past

def invoice_date_in_past
  if invoice_date.future?
    errors.add(:invoice_date, 'must be a date in the past')
  end
end

Попробуйте вот так:

validate check_invoice_date_is_future

def check_invoice_date_is_future
 if invoice_date.present?
   errors.add(:invoice_date, "Should not be in future.") if invoice_date.future?
 else
   errors.add(:invoice_date, "can't be blank.")
 end
end
Другие вопросы по тегам