【问题标题】:How to require some lib files from anywhere如何从任何地方要求一些 lib 文件
【发布时间】:2013-07-30 20:04:57
【问题描述】:

我会解释一下我的情况。

这是我在 Rails 应用程序中的文件树:

lib/my_module.rb

require 'my_module/my_file'

module My_module

end

lib/my_module/my_file.rb

class Tweetag::Collector
   (...)
end

我已经制作了一个 ruby​​ 脚本,并将其放入 config/jobs/

我真的不明白我应该如何在这个文件中要求文件 my_file.rb。

require '../../my_module/my_file.rb'

它给了我`require':无法加载这样的文件

同样的错误只需要'my_module',这是我在我的控制器中所做的......

有人来给我解释一下吗?非常感谢

【问题讨论】:

    标签: ruby-on-rails ruby require


    【解决方案1】:

    您可以自动包含 lib folder 下的所有内容并避免这些问题:

    config/application.rb中输入您的文件

    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
    

    【讨论】:

    • 我做到了,但仍然:`
      ': uninitialized constant MyModule (NameError)
    • 现在在你需要的地方包含你的模块,include My_module
    • 您声明了My_module,但您使用的是MyModule。修复此不一致。但是惯例是为您定义的模块使用MyModule 表单
    • 其实你可以用“Tweetag”替换所有的“my_module”,用“Collector”替换所有的“my_file”。我试图在我的解释中笼统,但我失败了。无论如何,当我“包含 Tweetag”时,它不起作用。
    • 在带有 Rails 5.2.2 的生产服务器上,您可能需要使用 config.eager_load_paths += %W(#{config.root}/lib)
    【解决方案2】:

    如果您只想需要一个特定的文件,那么, 像这样与 Rails root 相关的事情

    for example: --
    
    lib/plan.rb
    
    module Plan
     ...some code...
    end
    

    如果您只想在某些模型中使用它,请说 app/models/user.rb

    在用户模型中做

    require "#{Rails.root}/lib/plan"
    
    class User < ActiveRecord::Base
      include Plan
    end
    

    如果您希望它随处可用

    @VecchiaSpugna 给出了一个解决方案

    或者你可以在 config/initializers 文件夹中创建一个 ruby​​ 文件

    并要求那里的所有文件一个接一个

    try this
    
    require '../../my_module/my_file'
    
    instead of 
    
    require '../../my_module/my_file.rb'
    

    您不需要在 require 中指定文件的扩展名。

    【讨论】:

    • 其实我只是明白我不能像你刚才说的那样做一些特定于 Rails 的事情。我只是想运行命令行“ruby my_ruby_script.rb”并在其中需要我的lib模块。
    • require Rails.root.join('lib', 'plan') 不是更习惯吗?
    【解决方案3】:

    我认为有两种解决方案。

    1) 将 lib 路径添加到搜索路径。 在红宝石中:

    $:.unshift('../../my_module/lib')
    

    那你可以require 'my_module.rb'

    我认为Vecchia Spugna answer 是我的 ruby​​-answer 的 rails 版本。 (我不熟悉 Rails)。

    2) 另一种解决方案:

    在您的lib/my_module.rb 中,您需要my_file。该文件相对于您的my_module.rb?然后使用require_relative:

    require_relative './my_module/my_file'
    

    【讨论】:

    • 1) 是要走的路,因为 config/jobs 中的作业似乎不是从他的 rails 应用程序中启动的。因此,他必须按照您的描述自己设置加载路径,而不是期望未使用的 rails 环境会为他执行此操作。
    【解决方案4】:

    只是插话,因为我花了很长时间才弄清楚这一点,因为很少有解决方案奏效。

    • 我不得不使用普通的旧要求。我把它放在config/application.rb 文件中。

    patching_file_path = File.expand_path("./lib", Dir.pwd) Dir[patching_file_path+'/*.rb'].each {|file| require file }

    • 我还在我试图要求的文件中放置了一个临时的puts "I'm Working!,以便我可以检查控制台以查看它是否实际加载。

    • 此外,如果您使用的是 spring 加载程序,则在启动控制台之前,您应该在启动 rails 控制台之前在终端中执行bin/spring stop。否则,它不会加载新文件。

    【讨论】:

    • 我也被这个问题困扰了一段时间。停止 Spring 对我有用。干杯!
    【解决方案5】:

    类似于require_relative,

    # inside lib/my_module.rb 
    require File.expand_path('./my_module/my_file', File.dirname(__FILE__))
    

    这会扩展当前文件目录的路径并添加所需的相对文件路径。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      相关资源
      最近更新 更多