ruby-on-rails – 需要依赖来获取Rails子类
我有以下设置:
应用程序/模型/ 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 解决方法
默认情况下,在开发环境中,Rails会在app的常用子目录中自动加载常量,方法是查看常规位置(例如/app/models/my_module/service/rack.rb用于MyModule :: Service :: Rack).当第一次引用常量而不是应用程序初始化时,会发生此自动加载.
但这意味着在引用常量之前,除非明确要求,否则不会加载定义它的文件. 因此,当您调用MyModule :: Service.raw_types时,如果尚未定义,则从app / models / my_module / service.rb加载MyModule :: Service.但是,如果尚未对其子类进行引用,则除非明确要求定义它们的文件,否则不会定义这些常量.因此,要求在该方法调用上自动加载的文件中的那些文件使它们可用. 道德:如果你想确保每当MyModule :: Service都定义了MyModule :: Service的子类,你需要在/app/models/my_module/service.rb中要求它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |