Rails — контекстные проверки на основе состояния

#validation

#проверка

Вопрос:

Допустим, существует модель post, подобная этой:

 class Post < ActiveRecord::Base
  .......
  .......
end
  

Он имеет два атрибута : title и :body.

Теперь объект Post может проходить через несколько этапов: ‘черновик’ -> ‘опубликовано’.

Теперь при сохранении записи в режиме черновиков :title не требуется. Но при сохранении его в опубликованном режиме в заголовке должна быть проверка присутствия:

 validates_presence_of :title
  

Итак, каков наилучший способ сделать это в Rails? Я думаю, что некоторая реализация шаблона декоратора была бы отличной, в которой в контроллере я бы динамически добавлял проверки к активному объекту записи.

Это упрощенная версия более серьезной проблемы, с которой я столкнулся. В реальном случае выполняется намного больше проверок, включая те, которые выполняются для связанных объектов.

Ответ №1:

Если вы используете state_machine для ваших переходов состояний, он поддерживает именно то, что вы ищете, с примерами в файле readme.

В противном случае все проверки rails имеют необязательный if параметр. Если, например, у вашего post есть published? метод, который возвращает, находится ли он в опубликованном состоянии, вы могли бы написать, validates_presence_of :title, if: :published? и заставить его делать именно то, что вам нужно.

Комментарии:

1. Большое спасибо! Я использовал aasm для состояний. Может быть, пришло время переключиться на state_machine 🙂

2. Пока не спешите переключаться — state_machine более популярен, но, похоже, больше не развивается активно.

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