这里是我落得这样做:
(1)在类app/lib/foo.rb
,我加入到要求的相应文件
def self.load_foos
Dir["#{Rails.root}/app/lib/foos/*_foo.rb"].each do |file|
require file
end
end
(2)在foo.rb
一个静态方法,我添加了一个静态方法,这样子类可以注册自己
def self.register
if @@subclasses.include?(self.registration_symbol)
raise FooExceptionSymbolAlreadyUsed, "symbol [#{self.registration_symbol}] is already in use."
end
@@subclasses[self.registration_symbol] = [self.registration_priority,self]
end
(3)我在app/lib/foos
创建一个目录,在我把变种foo的子类并将它们命名为this_foo.rb
和that_foo.rb
。
(4)在子类app/lib/foos/this_foo.rb
,添加以下
class Foos::ThisFoo < Foo
def self.registration_symbol
:this
end
def self.registration_priority
100
end
# other methods removed to make example easier to read
register
end
(5)我添加了一个config/initializers/load_foos.rb
它只是有
Foo::load_foos
美孚的任何亚类,我把在app/lib/foos/
和名称正确,将在启动时自动加载。每个子类重写和实现registration_symbol
和registration_priority
(优先级稍后用于对枚举进行排序)的方法,并且该符号用于create方法。因此,我可以向我的开发者发布一个spec,告诉他们Foo在子类中实现哪些方法,以及如何注册它以及在哪里保存它,然后Rails应用程序会在下一次启动时自动加载这些文件。
我正在寻找使用方法。 'config/initializers'是我一直在考虑的方法之一。只是想看看这是否是解决这个问题的适当方式,或者是否有不同/更好的东西。感谢你的回答。 – sorens 2011-03-25 01:16:19