红宝石state_machine宝石 - 测试validates_presence_of

问题描述:

我已经添加了state_machine支持我的Post类:红宝石state_machine宝石 - 测试validates_presence_of

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 ::机文档中的以下内容:?

can_park(需求= {}) - 检查是否 “公园” 事件可以被解雇给出对象的当前状态。这不会在ORM 集成中运行验证。要检查事件是否可以触发并通过验证, 将使用事件属性(例如state_event),如每个ORM集成的 “Events”文档中所述。

现在,如果我可以确定哪些'使用事件属性(例如state_event),如每个ORM集成的“Events”文档中所述。意味着在ActiveRecord的范围内。

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

k.valid? 

你会发现对象的状态是无效的。一旦你把对象变成一个有效的状态就ActiveRecord而言,state_machine将允许它改变状态。

要检查,看看有什么验证错误有,使用:

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

,并期待在输出。解决这些问题,然后再次尝试状态转换。