我有一个依赖 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?为假。
我错过了什么?
最佳答案
我想我找到了解决方案。基本上发生的事情是 state_machine 首先评估 :if 条件,然后才执行 before_transition。
所以顺序是:
If (GuardCondition == true)
run before_transition
run transition
run before_transition
关于ruby-on-rails - before_filter 在 state_machine :( 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292592/