红宝石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}"}
,并期待在输出。解决这些问题,然后再次尝试状态转换。