Вызов специальных методов проверки в Rails
Я только обновил свои рельсы до 2.3.4, и я заметил это с проверками:
Допустим, у меня есть простая модель компании, у которой есть имя. ничего для этого.
Я хочу выполнить собственную проверку:
class Company < ActiveRecord::Base
validate :something
def something
false
end
end
Сохранение модели действительно работает в этом случае.
То же самое происходит, если я переопределяю validate() и возвращаю false.
Я заметил это в более сложной модели, где моя проверка возвращала false, но объект все еще сохранялся... Я попробовал это в по существу пустой модели и применил то же самое. Есть ли у меня новая практика? Это не похоже на некоторые из моих старых правил rails.
Ответы
Ответ 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")