Скажем, у меня есть настраиваемый установщик в модели Activemodel DateRange, который автоматически устанавливает атрибут DateTime при вводе строки. Это похоже на это
def from=(value)
@from = value.to_date
end
Теперь это работает, если вы вводите допустимую строку даты, но если вы вводите недопустимую дату, это останавливает мою заявку. Как я могу отменить назначение, чтобы приложение продолжило работу, а DateRange не прошел проверку позже в моем контроллере?
3 ответа
def from=(value)
begin
@from = value.to_date
rescue ArgumentError, NoMethodError
errors.add(:from, "is not a valid date")
end
end
Возможно, лучший способ сделать это, но это должно сработать
from
, как это было раньше). Я обнаружил, что для этого вам нужно инкапсулировать эту логику внутри валидатора: stackoverflow.com/a/9676246/1755300
valid?
полностью проигнорирует добавленную ошибку, и модель может быть создана/обновлена.
valid?
будет очистить errors
перед выполнением фактических обратных вызовов проверки
Обычно вы хотите спасти / решить любую проблему в вашем сеттере.
def from=(value)
@from = Date.parse(value)
rescue ArgumentError
nil
end
Затем позвольте вашим обычным проверкам даты обрабатывать значение nil позже.
Я бы не стал добавлять ваши ошибки в сеттер, так как ему не нужно знать о ваших проверках и наоборот.
Как говорит @jordelver, нет смысла добавлять ошибки проверки, кроме как во время проверки. Однако вы можете сохранить ошибку в виртуальном атрибуте и проверить ее во время проверки.
validate :no_bad_dates
attr_accessor :bad_date_error
def from=(value)
@from = Date.parse(value)
rescue ArgumentError => ex
self.bad_date_error = ex
end
def no_bad_dates()
errors.add(:from, bad_date_error.message) if bad_date_error
end
bad_date_error
не обязательно должен быть общедоступным. Реализовано здесь как attr_accessor
для упрощения истории.
Похожие вопросы
Связанные вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.