【问题标题】:Rails Full Engine using a Full Engine使用完整引擎的 Rails Full Engine
【发布时间】:2012-11-14 18:18:50
【问题描述】:

我有这个带有 X 功能的完整的 Rails 引擎 Foo。

我想制作另一个引擎,引擎 Bar,它几乎相同,但用 y 覆盖功能 x。 (它的作用基本相同,但一些控制器动作和视图的实现方式不同)。

(我稍后可能会将其拆分为几个可安装的引擎,但现在,这将是设置: 项目 Baz,使用引擎 Bar,使用引擎 Foo)

我想知道是否有任何陷阱。好像不是经常使用的模式? 还有其他人使用这种“某种引擎继承”吗?

【问题讨论】:

    标签: ruby-on-rails design-patterns rails-engines


    【解决方案1】:

    Ruby OpenClassing 是您想要做的。例如,

    # in Engine Foo
    #   this code creates functionality x
    
    Foo::SomeRubyClass
      # functionality x
      def some_method
        0.10
      end
    end
    
    
    # in Engine Bar
    #   this code opens and reevaluates the functionality x in Foo Engine
    
    Foo::SomeRubyClass.class_eval do
      # functionlity x method
      def some_method
        0.05
      end
    end
    

    使用 Rails 模型/视图/控制器进行更全面的解释。 http://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers

    【讨论】:

    • 谢谢,我忽略了这个简单的解决方案。结果可能是,我不应该在 Foo 和 Bar 中给我的文件命名?
    • 实际上,将其命名为相同是有道理的,这样您就可以看到什么是 Open Classing 什么。开放分类通常被称为“装饰器”模式,因为您正在用新的/不同的特性来装饰一些功能。
    • 更多关于装饰器模式:lukeredpath.co.uk/blog/…
    • 关于装饰器模式的更多信息:en.wikipedia.org/wiki/Decorator_pattern
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多