ruby-on-rails - before_filter 在 state_machine :( 中不工作

标签 ruby-on-rails ruby state-machine

我有一个依赖 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/

相关文章:

ruby - 无法删除 execjs gem

c++ - 嵌入式设备的有限状态机

design-patterns - 状态机设计模式

ruby-on-rails - 在 Rails 中将日期时间设置为 nil

ruby-on-rails - 在 Rails View 中截断 + 清理

ruby-on-rails - 用于搜索关键路径的元程序 Squeel

ruby-on-rails - 如何最好地在 ruby​​onrails 中创建递归目录列表的 xml 映射?

mysql - 详细的 RoR 应用程序...带有 MySQL 的 XML 或仅 MySQL

ruby - 尝试导入图像支持时 compass 编译失败

c - 串行协议(protocol)的状态机