Подтвердить что ты не робот

Вызов специальных методов проверки в Rails

Я только обновил свои рельсы до 2.3.4, и я заметил это с проверками: Допустим, у меня есть простая модель компании, у которой есть имя. ничего для этого. Я хочу выполнить собственную проверку:

class Company < ActiveRecord::Base

  validate :something


  def something
    false
  end

end

Сохранение модели действительно работает в этом случае. То же самое происходит, если я переопределяю validate() и возвращаю false. Я заметил это в более сложной модели, где моя проверка возвращала false, но объект все еще сохранялся... Я попробовал это в по существу пустой модели и применил то же самое. Есть ли у меня новая практика? Это не похоже на некоторые из моих старых правил rails.

4b9b3361

Ответ 1

Ваши проверки выполняются при использовании метода validate. Однако рельсы не полагаются на возвращаемое значение.

Это зависит от наличия ошибок проверки или нет. Поэтому вы должны добавлять ошибки, когда ваша модель не проверяет.

def something
    errors.add(:field, 'error message')
end

Или, если ошибка не связана с полем:

def something
    errors.add(:base, 'error message')
end

Тогда ваша модель не будет сохранена, потому что есть ошибки.

Ответ 2

Вы получаете путаницу между проверками и обратными вызовами.

Проверки должны сбой, если есть какие-либо ошибки в объекте, неважно, вернет ли подтверждение. Обратные вызовы терпят неудачу, если они возвращают false, независимо от того, добавили ли они какие-либо ошибки в объект.

Rails использует вызовы действительные? от сохранения вызовов, которые не проверяют результат каких-либо проверок.

Изменить: Rails обрабатывает validate :method как обратный вызов, но действителен? все еще не проверяет их результаты, только за ошибки, которые они добавили к объекту.

Я не думаю, что это поведение вообще изменилось, но я мог ошибаться. Я не думаю, что когда-либо писал подтверждение, чтобы вернуть false раньше.

Ответ 3

Только FYI errors.add_to_base('error message') устарел в рельсах 3 и получил замену на

errors[:base] << "Error message" 

или

errors.add(:base, "Error message")