27

我会解释我的情况。

这是我的 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'

它给了我“要求”:无法加载此类文件

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

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

4

5 回答 5

28

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

输入这个你的文件config/application.rb

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
于 2013-07-30T15:42:59.357 回答
22

如果您只想需要一个特定的文件,请执行与 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 中指定文件的扩展名。

于 2013-07-30T16:54:24.173 回答
7

我认为有两种解决方案。

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

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

那么你也能require 'my_module.rb'

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

2)另一种解决方案:

在你的lib/my_module.rb你需要my_file. 该文件位于相对于您的my_module.rb? 然后使用require_relative

require_relative './my_module/my_file'
于 2013-07-30T18:38:48.530 回答
1

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

• 我不得不使用普通的旧要求。我把它放在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 loader,那么在启动控制台之前,您应该bin/spring stop在启动rails 控制台之前在终端中执行此操作。否则,它不会加载新文件。

于 2019-02-14T22:25:25.153 回答
0

与require_relative类似,

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

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

于 2018-10-26T21:50:12.053 回答