#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. Ах да. Другое дело, в моем случае мне также пришлось бы проверять связанные модели во время изменения состояния, как бы я это сделал?