Ruby state_machine gem - тест validates_presence_of - PullRequest
1 голос
/ 03 мая 2011

Я добавил поддержку 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.

1 Ответ

1 голос
/ 06 мая 2011

Проблема заключается в том, что ваш объект не проходит стандартную проверку ActiveRecord;то есть, если вы сделаете:

k.valid?

, вы обнаружите, что состояние объекта недопустимо.Как только вы переведете объект в действительное состояние в том, что касается ActiveRecord, то state_machine позволит ему изменять состояния.

Чтобы проверить и увидеть, какие есть ошибки проверки, используйте:

k.valid?
k.errors.each {|field, message| puts "#{field}: #{message}"}

и посмотрите на вывод.Исправьте эти проблемы и попробуйте снова выполнить переходы между состояниями.

...