ActiveModel проверить пользовательский сеттер


Скажем, у меня есть пользовательский сеттер на activemodel model DateRange, чтобы автоматически установить атрибут DateTime, если введена строка. Это выглядит так

  def from=(value)
    @from = value.to_date
  end

Теперь это работает, если вы вводите допустимую строку даты, но если вы вводите недопустимую дату, это останавливает мое приложение. Как я могу отменить назначение так, что приложение будет двигаться дальше, и DateRange не проходит проверку позже в моем контроллере?

3 2

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