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

Ruby on rails 如何从任何地方需要一些lib文件,ruby-on-rails,ruby,require,Ruby On Rails,Ruby,Require,我会解释我的情况 以下是我的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

我会解释我的情况

以下是我的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”:无法加载这样的文件

同样的错误只需要“我的_模块”,这是我在控制器中所做的


有人来向我解释吗?非常感谢

您可以将所有内容自动包含在lib
文件夹下
并避免以下问题:

config/application.rb

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

如果您只需要一个特定的文件, 执行与Rails根相关的操作,如下所示

for example: --

lib/plan.rb

module Plan
 ...some code...
end
如果您只想在某些型号中使用它,请使用app/models/user.rb

用户模型中的do

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

class User < ActiveRecord::Base
  include Plan
end

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

我认为有两种解决方案

1) 将库路径添加到搜索路径。 在ruby中:

然后您可以
要求“my_module.rb”

我认为这是我的ruby答案的rails版本。(我不熟悉rails)

2) 另一个解决方案:

lib/my_module.rb中
需要
my_文件
。此文件相对于您的
my_module.rb
?然后使用
require\u relative

require_relative './my_module/my_file'

类似于require_relative

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

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

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

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

patching_file_path=file.expand_path(“./lib”,Dir.pwd)
Dir[patching_file_path+'/*.rb']。每个{文件|需要文件}

•我还将一个临时
放在我试图要求的文件中,这样我就可以检查控制台,看看它是否正在实际加载


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

我这样做了,但仍然:`:未初始化常量MyModule(NameError)现在在您需要的地方包含您的模块,使用
include My_module
您声明的
My_module
,但您使用的是
MyModule
。解决此不一致性。但是惯例是对您定义的模块使用
MyModule
表单。实际上,您可以用“Tweetag”和所有“My_文件”替换所有“My_module”“收藏家”。我试图泛泛地解释,但失败了。无论如何,当我“包含Tweetag”时,它不起作用。在Rails 5.2.2的生产服务器上,您可能需要使用
config.eager\u load\u path+=%W(#{config.root}/lib)
事实上,我知道我不能像您刚才所说的那样做Rails特有的事情。我只是想运行命令行“ruby my_ruby_script.rb”并在其中需要我的lib模块。如果执行
require Rails.root.join('lib','plan'),
?1)不是更为惯用的方法,因为config/jobs中的作业似乎不是从Rails应用程序中启动的。因此,他必须按照您描述的那样自己设置加载路径,而不是期望一个未使用的rails环境能够为他完成这项工作。阻止春天对我起了作用。干杯
require_relative './my_module/my_file'
# inside lib/my_module.rb 
require File.expand_path('./my_module/my_file', File.dirname(__FILE__))