首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将代码注入ruby状态机?

将代码注入ruby状态机?
EN

Stack Overflow用户
提问于 2012-08-28 06:23:51
回答 1查看 642关注 0票数 3

我想用猴子补丁插件周状态机(https://github.com/pluginaweek/state_machine),这样我就可以把代码从mixin模块注入到状态机中。有人知道如何在状态机中定义一个新方法来实现这一点吗?或者,也许有一种更好的方法来完成我想要完成的事情?

假设,

代码语言:javascript
运行
复制
class Artifact < ActiveRecord::Base
  include Provisionable # << This module makes the magic method 'provision',
                        # << below, available

  state_machine :machine_state, :initial => :s_initial do
    # ...
    provision(:param1, :param2, :param3) # << The Question: how to define
                                         # << this in the Provisionable mixin
                                         # << module, below
    ...
  end
...
end

module Provisionable
  #
  # << provision() is supposed to inject the desired code into the state machine:
  #
  def provision

    # << Code sample to be injected begins here:
    event :parameterize do
      transition :s_unprovisioned => :s_initial
    end
    before_transition :s_unprovisioned => :s_initial do |artifact, transition|
      transition.args.each_pair do |param, value|
        # etc...
      end
    end
    # >> Code to be injected ends here.

  end
end

对于那些购买状态机的人,我强烈推荐这个。

谢谢!

后来补充道:我找到了一个解决方案,希望能对其他人有所帮助。我没有混入一个模块,而是给state_machine打了补丁,以添加实例方法来注入代码。

代码语言:javascript
运行
复制
StateMachine::Machine.class_eval do
    def inject_provisioning()

        event :start do
            transition :s_initial => :s_provisioning
        end
        after_transition :s_initial => :s_provisioning do |goal, transition|
            # Do useful stuff here
            true
        end

        event :provision do
            transition :s_provisioning => :s_completed
        end

        before_transition :s_provisioning => :s_completed do |goal, transition|
            artifact_type = transition.args[0]
            params = transition.args[1]
            # Useful stuff here
            true
        end

        after_transition :s_provisioning => :s_completed do |goal, transition|
            artifact_type = transition.args[0]
            params = transition.args[1]
            # Useful stuff here
        end
    end

    def inject_expiration()
        event :chron do
            expired_callback = lambda \
                do |goal|
                    return false if goal.expires_at == :never
                    goal.expires_at.to_i < DateTime.now.to_i
                end
            active_callback = lambda \
                do |goal|
                    return true if goal.expires_at == :never
                    goal.expires_at.to_i >= DateTime.now.to_i
                end
            transition all - :s_expired => :s_expired, :if => expired_callback
        end

        before_transition all - :s_expired => :s_expired do |goal, transition|
            goal.undo
        end
    end

现在,当我在类中打开一个state_machine定义时,我可以进行简单的类似宏的调用来注入代码:

代码语言:javascript
运行
复制
state_machine :machine_state, :initial => :s_initial do
    inject_provisioning
    inject_expiration
end

希望其他人能找到有用的东西。

EN

回答 1

Stack Overflow用户

发布于 2012-08-29 07:21:35

很难确切地说出您正在尝试做什么,但希望这段代码能有所帮助

代码语言:javascript
运行
复制
class Artifact < ActiveRecord::Base
  extend Provision

  attr_accessible :some_value, :state

  state_machine :state, :initial => :initial do
    event :foo do
      transition :initial => :bar
    end

    Artifact.provision(self, :param1, :param2, :param3)

    event :fud do
      transition :bar => :initial
    end

  end
end

注意-我们混合使用extend而不是include -将方法放在类级别而不是实例,将self (状态机)传递给方法

代码语言:javascript
运行
复制
module Provision
  def provision(state_machine, *args)

    state_machine do
      event :provision do
        transition :initial => :provisioned
      end

      event :deprovision do
        transition :provisioned => :deprovisioned
      end

      before_transition :provisioned => :deprovisioned do |item, transition|
        # transition.args.length == 0
        args.each do |arg|
          puts arg
        end
      end
    end

  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12150448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档