ActiveModel проверить пользовательский сеттер
Скажем, у меня есть пользовательский сеттер на activemodel model 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
Вероятно, лучший способ сделать это, но это должно сработать
Обычно вы хотите спасти / решить любую проблему в вашем сеттере.
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