Mat*_*ias 8 ruby ruby-on-rails ruby-on-rails-4
我有以下设置:
应用程序/模型/ 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"
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ my_module /服务/ rack.rb:
module MyModule
class Service::Rack < Service
end
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ my_module /服务/ rails.rb:
module MyModule
class Service::Rails < Service
end
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ my_module /服务/ sinatra.rb:
module MyModule
class Service::Sinatra < Service
end
end
Run Code Online (Sandbox Code Playgroud)
这到目前为止工作,但现在我的问题:
为什么我要添加这三行:
require_dependency "my_module/service/rack"
require_dependency "my_module/service/rails"
require_dependency "my_module/service/sinatra"
Run Code Online (Sandbox Code Playgroud)
到我的service.rb文件?
如果我不添加三行:
MyModule::Service.raw_types
=> []
Run Code Online (Sandbox Code Playgroud)
如果我添加三行:
MyModule::Service.raw_types
=> ["Rack", "Rails", "Sinatra"]
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?
顺便说一句:我使用Ruby 2.0.0-preview1,Rails 4.0.0.rc1并创建一个新的Rails引擎
rails plugin new MyModule
Run Code Online (Sandbox Code Playgroud)
gre*_*tes 13
默认情况下,在开发环境中,Rails将app通过查看常规位置(例如,/app/models/my_module/service/rack.rbfor 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
| 归档时间: |
|
| 查看次数: |
5172 次 |
| 最近记录: |