如何从任何地方需要一些lib文件

Zoz*_*Zoz 21 ruby ruby-on-rails require

我会解释一下我的情况.

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

LIB/my_module.rb

require 'my_module/my_file'

module My_module

end
Run Code Online (Sandbox Code Playgroud)

LIB/my_module/my_file.rb

class Tweetag::Collector
   (...)
end
Run Code Online (Sandbox Code Playgroud)

我已经制作了一个ruby脚本,我已将其置于config/jobs /

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

require '../../my_module/my_file.rb'
Run Code Online (Sandbox Code Playgroud)

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

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

有人在这里向我解释一下?非常感谢

小智 21

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

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

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


Sac*_*ngh 15

如果你只想要一个特定的文件,

像这样做一些相对于Rails root的东西

for example: --

lib/plan.rb

module Plan
 ...some code...
end
Run Code Online (Sandbox Code Playgroud)

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

在用户模型中做

require "#{Rails.root}/lib/plan"

class User < ActiveRecord::Base
  include Plan
end
Run Code Online (Sandbox Code Playgroud)

如果你想让它随处可用

一个解决方案由@VecchiaSpugna提供

您还可以在config/initializers文件夹中创建ruby文件

并要求所有文件一个接一个

要么

try this

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

instead of 

require '../../my_module/my_file.rb'
Run Code Online (Sandbox Code Playgroud)

  • 执行 `require Rails.root.join('lib', 'plan')` 会不会更惯用? (3认同)

knu*_*nut 7

我认为有两种解决方案.

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

$:.unshift('../../my_module/lib')
Run Code Online (Sandbox Code Playgroud)

然后你可以 require 'my_module.rb'

我认为Vecchia Spugna的答案是我的红宝石答案的轨道版本.(我不熟悉rails).

2)另一个解决方案:

lib/my_module.rb你的需要my_file.这个文件是相对于你的my_module.rb?然后使用require_relative:

require_relative './my_module/my_file'
Run Code Online (Sandbox Code Playgroud)