Ruby state_machine gem - 测试validates_presence_of

时间:2011-05-03 19:09:01

标签: ruby transition state-machine

我已将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的范围内。

1 个答案:

答案 0 :(得分:1)

问题似乎是您的对象没有通过标准的ActiveRecord验证;即,如果你这样做:

k.valid?

你会发现对象的状态无效。就ActiveRecord而言,一旦让对象进入有效状态,state_machine将允许它改变状态。

要检查并查看有哪些验证错误,请使用:

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

并查看输出。修复这些问题,然后再次尝试状态转换。