Проверка 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