[英]Delegate class in main app to class in rails engine
我有一个隔离的Rails Engine: Admin
。
在该引擎中,我通过GUI创建Sites
。
在引擎中:
module Admin
class Site < ActiveRecord::Base
end
end
在主应用程序中,我从引擎的Site
继承,以便在根级别将其用作常量:
class Site < Admin::Site
end
我这样做是因为在主应用程序的模型,控制器和测试中将Admin::Site
耦合在一起感觉不对。 但是我猜想这种方法有一些弊端,我也可能会认为耦合是相同的。
我该如何以比继承更好的方式委派这个?
要么
我应该重组代码,或者将Site
类放到主应用程序和引擎都可以使用的gem中吗? 我真正想要的是引擎类的接口,以减少入口点,从而减少耦合。
旁注,我总共有3-4个此类驻留在引擎中,但在主应用程序中使用。
编辑:
也许我应该像这样包装它:
class Site
def initialize(args = {})
@klass = Admin::Site.new(args)
end
def method_missing(method_name, *args, &block)
@klass.send(method_name, *args, &block)
end
end
当然,那么我还可以缩小Site
的界面,使其仅包含主应用程序中Admin::Site
所需的内容。
我想到了两种可能的解决方案,
1)ActiveSupport :: Conern
2)公开课
鉴于您已经在引擎中隔离了这3-4个模型/控制器,一种方法是利用ActiveSupport :: Concern在MainApp中明确包含引擎的功能。
此处的更多信息, ActiveSupport :: Concern上的Rails Docs
ActiveSupport ::关注示例:
# Rails Engine
module SomeEngine
module SomeController
extend ActiveSupprt::Concern
included do
before_filter :some_before_filter
end
# regular instance methods
def index
...
end
protected
def some_before_filter
....
end
end
end
# MainApp
class SomeController < BaseController
include SomeEngine::SomeController
# rest of MainApp logic
end
另一种常见的方法是在运行时重写Ruby类方法(“开放类”) 。 Spree通过在MainApp中为Engine模型/控制器类实现“装饰器”模式来实现此目的。
更多信息在这里, Spree的Decorators的实现
“ #class_eval做”示例,
# in MainApp
SomeEngine::SomeController.class_eval do
# logic added in the MainApp
end
我还将在RailsEngnes上查看有关RailsConf的演讲,
http://confreaks.com/videos/863-railsconf2012-rails-engines-patterns
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.