【问题标题】:Strategy for Rails app to hook into an engine's workflowRails 应用程序与引擎工作流挂钩的策略
【发布时间】:2013-09-20 14:52:58
【问题描述】:

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

我曾想过在应用程序中添加一个初始化程序,然后对引擎的消息处理类进行猴子补丁,但这让我觉得有点脏。

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

【问题讨论】:

  • 在我看来,猴子修补引擎的类是要走的路。即使您使用的是 gem 而不是引擎,您也必须对它们进行修补以修改它们的行为,例如设计。
  • 有几种方法。没有具体的代码示例很难判断。

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


【解决方案1】:

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

这听起来很像 javascript 回调方案。我们通常在 ruby​​ 中用块做的事情。

Monkey 修补听起来不像预期的 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

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

【讨论】:

  • 我喜欢这个想法,尽管它可能不适合我的情况。我不会从我的应用程序模型中访问引擎,实际上应用程序中的功能只会由引擎的模型触发。猜猜我需要使用初始化程序以某种方式添加回调,但真的不确定我如何能够在请求中持久保存它。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 2014-01-08
  • 2012-04-04
相关资源
最近更新 更多