У меня есть модель Event
с полем finish_time
и флажком формы с именем whenever
. Когда отмечен whenever
, я хочу установить finish_time
на nil
независимо от его значения в параметрах, когда whenever
не проверен, я хочу убедиться, что finish_time
является действительной датой, прежде чем сохранить ее в базы данных.
В настоящее время я достигаю этого, используя whenever
attr_accessor для события:
params[:event][:finish_time] = nil if whenever = params[:event].delete(:whenever)
@event = Event.new(params[:event])
@event.whenever = whenever
И использование условных проверок для проверки finish_time
, если whenever
равно false
validates_presence_of :finish_time, :unless => @whenever
Я не доволен дублированием, которое это создает. Единственный способ, которым finish_time
может быть nil
, - это если whenever
равен true
, и если вы меняете одно, вам часто приходится менять другое. Если Event
обновляется новым finish_time
, то whenever
также необходимо изменить на false
.
В идеале я хотел бы перенести валидацию на мой контроллер. Таким образом, при прямом доступе к модели whenever
можно легко указать, установив finish_time
в null
, но пользователи, публикующие в / events, будут кричать, если они не указали выбор. Однако я не могу найти способ условно добавить или удалить проверки к Event
из контроллера или даже если это лучший подход.
Каков наилучший способ удалить это дублирование?