gpt4 book ai didi

ruby-on-rails - 需要依赖才能获取 Rails 子类

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:01 26 4
gpt4 key购买 nike

我有以下设置:

应用程序/模型/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"

app/models/my_module/service/rack.rb:

module MyModule
class Service::Rack < Service
end
end

app/models/my_module/service/rails.rb:

module MyModule
class Service::Rails < Service
end
end

app/models/my_module/service/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.rbMyModule::Service::Rack )。这种自动加载发生在第一次引用常量时,而不是在应用程序初始化时。

但这意味着在常量被引用之前,除非明确要求,否则不会加载定义它的文件。

因此,当您调用 MyModule::Service.raw_types , MyModule::Serviceapp/models/my_module/service.rb 加载如果尚未定义。但是,如果尚未对其子类进行引用,则不会定义这些常量,除非明确需要定义它们的文件。因此,要求在该方法调用时自动加载的文件中的那些文件使它们可用。

寓意:如果要保证MyModule::Service的子类总是在 MyModule::Service 时被定义是,您需要在 /app/models/my_module/service.rb 中要求它们

关于ruby-on-rails - 需要依赖才能获取 Rails 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com