要求 'tire' gem 未在模型 class 中提及,但在 rails 应用程序中仍然可以使用它

require 'tire' gem not being mentioned in a model class but usage of it still works in rails app

我正在审查我继承的 rails 应用程序的代码,我不是 rails 方面的专家。在应用程序的 gem 文件中有:gem 'tire'。很好,但我希望在模型或控制器中使用 require 'tire' 以便能够使用此 gem 提供的库。 根据特定 gem 的文档,它说它需要作为模型 class 中的 mixin 包含在内。

 include Tire::Model::Search
 include Tire::Model::Callbacks

或者文档中提到在您计划使用轮胎 gem 的模型 class 中使用 require 'tire'。 但是在项目中,我没有在模型中看到这些 require/includes 中的任何一个。这些模型只是使用 api 而没有 requiring/including 像这样:

ret = Tire.index "icrd" do 
            import [icrdObj]

            refresh
        end

这是如何运作的?我应该在 rails 项目的什么地方查看以了解为什么不需要 require 或 include?是否正在进行某种自动加载?

当 gem 包含在 Gemfile 中时,将自动调用关联的 require .. 语句。

有关 rails 如何处理 gem 的解释,请参阅 http://www.justinweiss.com/blog/2014/10/13/how-does-rails-handle-gems/

来自该博文:

So, Bundler will look in your Gemfile for gems belonging to each of those groups, and call require on each of the gems it finds. If you have a gem nokogiri, it’ll call require "nokogiri" for you. And that’s why your gems usually just work in Rails, without any extra code on your part.

Bundler 有很多不错的方法。 Bundler.setup 确保您可以轻松地在您的应用中要求 gem。

Bundler.require(:default, :production) 例如(它接受组名)需要 all gems 通过执行 gem 文件自动执行 require 'tire', require 'rails' 等等,给你。

您可以通过在 gem 文件中的 gem 行附近添加 require: false 来跳过某些 gem 的自动要求,例如

gem 'rails', require: false

检查 Bundler.require 文档(位于 groups 下)