Как требовать некоторые файлы lib из любого места

Я объясню свою ситуацию.

Вот мое дерево файлов в моем приложении rails:

lib/my_module.rb

require 'my_module/my_file'

module My_module

end

Библиотека/my_module/my_file.rb

class Tweetag::Collector
   (...)
end

Я сделал ruby ​​ script, который я ввел в config/jobs/

Я действительно не понимаю, как я должен требовать файл my_file.rb в этом файле.

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

Он дает мне "require": невозможно загрузить такой файл

Такая же ошибка, просто требующая "my_module", что я делаю в своих контроллерах...

Кто-нибудь здесь, чтобы объяснить мне? Большое спасибо

Ответ 1

Вы можете автоматически включить все под lib folder и избежать этих проблем:

Введите этот файл в config/application.rb

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

Ответ 2

Если вы хотите запросить только определенный файл, сделайте что-нибудь относительно корня Rails, как это

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 предлагает одно решение

или вы можете создать файл ruby в папке config/initializers

и требовать все файлы там один за другим

ИЛИ ЖЕ

try this

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

instead of 

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

Вам не нужно указывать расширение для файла в require.

Ответ 3

Я думаю, что есть два решения.

1) Добавьте путь к пути поиска. В рубине:

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

Затем вы можете require 'my_module.rb'

Я думаю, ответ Vecchia Spugna - это рельсовая версия моего рубинового ответа. (Я не знаком с рельсами).

2) Другое решение:

В вашем lib/my_module.rb вам потребуется my_file. Этот файл находится относительно вашего my_module.rb? Затем используйте require_relative:

require_relative './my_module/my_file'

Ответ 4

Аналогично require_relative,

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

Это расширяет путь к текущему каталогу файлов и добавляет относительный путь к файлу, который требуется.

Ответ 5

Просто вмешиваюсь, потому что мне понадобилось целую вечность, чтобы понять это, потому что очень мало решений работало.

• Мне пришлось использовать старый добрый запрос. Я положил его в файл 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! В файл, который я пытаюсь запросить, чтобы проверить консоль, чтобы убедиться, что она действительно загружается.

• Кроме того, если вы используете пружинный загрузчик, перед тем, как запустить консоль, вы должны сделать bin/spring stop в своем терминале, прежде чем запустить консоль рельсов. В противном случае он не будет загружать новые файлы.