Я добавил поддержку state_machine в свой класс Post:
state_machine :state, :initial => :draft do
event :publish do
transition :draft => :published
end
state :draft do
end
state :published do
end
end
В ERB новое сообщение указывает, что оно может быть опубликовано:
>> k=Job.new
=> #<Job id: nil, title: nil>
>> k.can_publish?
=> true
Однако, это не может быть опубликовано:
>> k.publish!
StateMachine::InvalidTransition: Cannot transition state via :publish from :draft
Как выяснилось, класс validates_presence_of: title предотвращает изменение состояния. Метод save! () Не работает, потому что: заголовок обязателен. К сожалению, ошибка InvalidTransition немного обманчива.
Я обеспокоен тем, что это сообщение об ошибке повлияет на обработку пропущенными полями слоя View (: title в моем примере) Есть ли способ проверить validates_presence_of в can_publish? метод?
** редактировать **
В документации StateMachine :: Machine я нашел следующее:
can_park? (Require = {}) - Проверяет, можно ли запустить событие "park"
учитывая текущее состояние объекта. Это не будет запускать проверки в ORM
интеграций. Чтобы проверить, может ли событие срабатывать и проходит валидацию,
использовать атрибуты события (например, state_event), как описано в
Документация «События» каждой интеграции ORM.
Теперь, если я могу просто определить, что «использовать атрибуты события (например, state_event), как описано в документации« События »каждой интеграции ORM». значит в сферу ActiveRecord.