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

问题描述 投票:20回答:5

我会解释一下我的情况。

这是我的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
5个回答
20
投票

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

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

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

14
投票

如果你只想要一个特定的文件,那么就像这样做一些与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中的文件指定扩展名。


6
投票

我认为有两种解决方案。

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'

0
投票

与require_relative类似,

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

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


0
投票

只是因为我花了很长时间才想到这一点,因为很少有解决方案有效。

•我不得不使用普通的旧要求。我把它放在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!,这样我就可以检查控制台,看看它是否真的在加载。

•另外,如果您使用弹簧加载器,在启动控制台之前,您应该在启动rails控制台之前在终端中执行bin/spring stop。否则,它将不会加载新文件。

© www.soinside.com 2019 - 2024. All rights reserved.