Rails应用程序的策略可以挂钩引擎的工作流程

时间:2013-09-20 14:52:58

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 rails-engines

我创建了一个定义了工作流程的引擎。消息进入,以某种方式处理,并被发送出去。现在我想让使用此引擎的应用程序挂钩到流程中并修改消息的处理。

我想过在应用程序中添加一个初始化程序,只是简单地说明引擎的消息处理类,但它让我觉得有点脏。

我确信有更明智的方式来做这样的事情。你能帮助我吗?

1 个答案:

答案 0 :(得分:1)

这不是一个需要“好”答案的问题,但我发布了正确代码格式的答案。

这听起来很像是一个javascript回调方案。我们通常用ruby做的事情,有块。

猴子修补声音肯定不像预期的api那样性感,而且从用户的角度看它总是看起来很乱。我可能会喜欢使用类方法,例如:

class Foo < ActiveRecord::Base
  include MyEngineConcern

  on_engine_stuff do |message|
    create!( name: 'hello', message: message )
  end
end

您的引擎类可以使用它:

module MyEngineConcern
  def self.included( base )
    base.extend ClassMethods
  end

  module ClassMethods
    def on_engine_stuff( &callback )
      MyEngine::Callbacks.add callback
    end
  end
end

module MyEngine
  class Callbacks
    class << self
      @_callbacks = []

      def add( callback )
        @_callbacks << callback
      end

      def process( message )
        @_callbacks.each do |callback|
          message = callback.call( message )
        end

        message
      end
    end
  end
end

请注意,这意味着你的引擎是由模型访问的,我们可能需要更多关于它的信息来建议正确的设计。