微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中要求它们.

原文地址:https://www.jb51.cc/ruby/270847.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐