我目前正在努力实现类似于此问题所选答案中提议的内容:Ruby design pattern: How to make an extensible factory class?
class LogFileReader
@@subclasses = { }
def self.create type
c = @@subclasses[type]
if c
c.new
else
raise "Bad log file type: #{type}"
end
end
def self.register_reader name
@@subclasses[name] = self
end
end
class GitLogFileReader < LogFileReader
def display
puts "I'm a git log file reader!"
end
register_reader :git
end
class BzrLogFileReader < LogFileReader
def display
puts "A bzr log file reader..."
end
register_reader :bzr
end
LogFileReader.create(:git).display
LogFileReader.create(:bzr).display
class SvnLogFileReader < LogFileReader
def display
puts "Subersion reader, at your service."
end
register_reader :svn
end
LogFileReader.create(:svn).display
单元测试工作完美无缺,但是当我启动服务器时,没有注册任何课程。我可能会遗漏一些静态方法调用是如何工作的?每个子类进行register_reader
调用的时间是什么时候?
答案 0 :(得分:0)
要回答OP关于类何时调用register_reader
的问题,该问题在文件加载时发生。将此代码添加到初始化程序中以自己加载文件。
Dir[Rails.root.join('path', 'to', 'log_file_readers', '**', '*.rb').to_s].each { |log_file_reader| require log_file_reader }