【问题标题】:Include a lib in Rails model - Is "require" required or not?在 Rails 模型中包含一个库 - 是否需要“要求”?
【发布时间】:2013-12-04 21:37:18
【问题描述】:

我的模型现在看起来像这样:

class Logo < ActiveRecord::Base
  include ImageManipulation
  ...
end

ImageManipulation 是一个名为image_manipulation.rb 的库,位于/lib/ 我可以毫无问题地使用该模型,但是今天我必须通过rails 控制台进行一些操作,并且在尝试执行Logo.delete_all 时,我收到了这个错误:

NameError: uninitialized constant Logo::ImageManipulation

所以,我将模型更改为如下所示:

require 'image_manipulation'
class Logo < ActiveRecord::Base
  include ImageManipulation
  ...
end

我的问题是...为什么当我想在 rails 控制台中使用 Logo 模型时需要 require,但在启动 rails s 并通过我的应用程序操作模型时却不需要?

【问题讨论】:

    标签: ruby-on-rails model require


    【解决方案1】:

    我建议rails s 以开发模式启动并自动加载在您的库位置中找到的类。通过rails console 运行应用程序时,这种自动加载可能不会以相同的程度发生。

    【讨论】:

      【解决方案2】:

      这是因为您的自动加载设置。

      当您加载 Rails 控制台时,Rails 不会立即require 应用程序中的每个文件,因为这会花费很长时间。相反,它使用“延迟加载”——它不会将类加载到内存中,直到它真正需要它。

      其工作原理是,当您在代码中使用解释器尚未看到的常量(即类或模块)时,它会智能猜测需要加载哪个文件才能找到该常量的代码。例如。对于User,它将查找名为user.rb 的文件,对于ImageManipulation,它将查找image_manipulation.rb,并查找命名空间常量,例如Image::Manipulation 它将寻找 image/manipulation.rb

      它在哪里寻找这些文件?在“自动加载路径”中,这是存储在 Rails 应用程序的 config 设置中的目录列表。因此,对于文件user.rb,它将寻找app/models/user.rbapp/controllers/user.rbapp/helpers/user.rb 等,直到a)它找到一个文件并加载它或b)它用完了可以查看的地方,在这种情况下它会引发NameError

      所以有两种情况你需要明确地require 一个文件:

      1. ImageManipulation 定义在 Rails 无法自动识别名称的文件中(即名为 image_manipulation.rb 的文件。)
      2. image_manipulation.rb 不在自动加载路径中的目录中。

      默认情况下,您的autoload_paths 包括所有标准app 目录,如modelscontrollers,但 包括lib(据我所知.. . 这可能取决于您的 Rails 版本)。因此,如果您希望能够自动加载ImageManipulation,您应该将它放在可以自动加载的位置,或者通过将以下行添加到config/application.rb,将lib 添加到您的自动加载路径中:

      config.autoload_paths.push(Rails.root.join("lib"))
      

      我不知道为什么ImageManipulation 会在rails s 下自动加载,但不会在rails c 下自动加载,但我怀疑您在不同的环境下运行这两个 rails 命令(例如,一个处于开发模式和另一个在生产中),并且环境具有不同的自动加载设置。尝试在您的应用目录中搜索autoloadautoload_paths,看看是否能发现任何异常。

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        相关资源
        最近更新 更多