вызов пользовательских методов проверки в Rails - PullRequest
57 голосов
/ 23 октября 2009

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

class Company < ActiveRecord::Base

  validate :something


  def something
    false
  end

end

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

Ответы [ 3 ]

109 голосов
/ 23 октября 2009

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

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

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

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

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

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

15 голосов
/ 23 октября 2009

Вы путаетесь между проверками и обратными вызовами.

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

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

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

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

8 голосов
/ 09 июня 2013

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

errors[:base] << "Error message" 

Или

errors.add(:base, "Error message")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...