我有以下设置:
应用程序/模型/ my_module / service.rb
module MyModule
class Service < ActiveRecord::Base
def self.types
self.subclasses
end
def self.raw_types
self.types.map { |c| c.name.split("::").last }
end
end
end
require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
应用程序/模型/ my_module /服务/ rack.rb:
module MyModule
class Service::Rack < Service
end
end
应用程序/模型/ my_module /服务/ rails.rb:
module MyModule
class Service::Rails < Service
end
end
应用程序/模型/ my_module /服务/ sinatra.rb:
module MyModule
class Service::Sinatra < Service
end
end
到目前为止有效,但现在我的问题是:
为什么我必须添加这三行:
require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
到我的service.rb文件?
如果我不添加三行:
MyModule::Service.raw_types
=> []
如果我添加三行:
MyModule::Service.raw_types
=> ["Rack", "Rails", "Sinatra"]
有人有想法吗?
顺便说一句:我使用Ruby 2.0.0-preview1,Rails 4.0.0.rc1并使用
创建一个新的Rails引擎rails plugin new MyModule
答案 0 :(得分:13)
默认情况下,在开发环境中,Rails会在app
的常用子目录中自动加载常量,方法是查看常规位置(例如,/app/models/my_module/service/rack.rb
为MyModule::Service::Rack
)。第一次引用常量时会发生此自动加载,而不是在应用程序初始化时。
但这意味着在引用常量之前,除非明确要求,否则不会加载定义它的文件。
因此,当您致电MyModule::Service.raw_types
时,MyModule::Service
会从app/models/my_module/service.rb
加载(如果尚未定义)。但是,如果尚未对其子类进行引用,则不会定义这些常量,除非明确要求定义它们的文件。因此,要求在该方法调用中 自动加载的文件中的那些文件使它们可用。
道德:如果您想确保MyModule::Service
始终定义MyModule::Service
的子类,则需要在/app/models/my_module/service.rb