我有一个依赖于state_machine来管理其不同状态的模型。一个特定事件需要before_transition,因为它需要在进行转换之前构建连接表。不幸的是它不起作用。
class DocumentSet < ActiveRecord::Base
state_machine :state, :initial => :draft do
# Callbacks
before_transition :on=>:submit, :do=>:populate_join_table
# States
state :draft
state :submitted
# Events
event :submit do transition :draft=>:submitted, :if=>:can_submit? end
end
def populate_join_table
puts '::::::::: INSIDE POPULATE_JOIN_TABLE'
end
def can_submit?
raise "Document Set has no Document(s)" if self.document_versions.blank?
true
end
现在当我做DocumentSet.submit时,它实际上从未进入populate_join_table,因为它评估了can_submit?为假。
我错过了什么?
答案 0 :(得分:3)
想想我找到了解决方案。基本上发生的是state_machine首先评估:if条件,然后才进行before_transition。
所以顺序是:
If (GuardCondition == true)
run before_transition
run transition
run before_transition
答案 1 :(得分:1)
保护条件控制该事件(和转换)在那时是否有效。在这种情况下,你的守卫返回false,所以你不会转换。这可能非常有用,但在您的情况下,您可能需要重新设计/重新思考以使回调运行。