我已将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!()方法失败,因为:title是必需的。不幸的是,InvalidTransition错误有点欺骗性。
我担心此错误消息会干扰View层对丢失字段的处理(在我的示例中为title)。有没有办法测试can_publish中的validates_presence_of?方法
**编辑**
我在StateMachine :: Machine文档中找到了以下内容:
can_park?(requirements = {}) - 检查是否可以触发“park”事件 给定对象的当前状态。这不会在ORM中运行验证 集成。要检查事件是否可以触发并通过验证, 使用事件属性(例如state_event),如中所述 每个ORM集成的“事件”文档。
现在,如果我可以确定每个ORM集成的“事件”文档中描述的'使用事件属性(例如state_event)。'表示在ActiveRecord的范围内。
答案 0 :(得分:1)
问题似乎是您的对象没有通过标准的ActiveRecord验证;即,如果你这样做:
k.valid?
你会发现对象的状态无效。就ActiveRecord而言,一旦让对象进入有效状态,state_machine将允许它改变状态。
要检查并查看有哪些验证错误,请使用:
k.valid?
k.errors.each {|field, message| puts "#{field}: #{message}"}
并查看输出。修复这些问题,然后再次尝试状态转换。