web-dev-qa-db-fra.com

Comment exiger des fichiers lib de n'importe où

Je vais expliquer ma situation.

Voici mon arborescence de fichiers dans mon application Rails: 

lib/mon_module.rb 

require 'my_module/my_file'

module My_module

end

lib/mon_module/mon_fichier.rb

class Tweetag::Collector
   (...)
end

J'ai fait un script Ruby que j'ai mis dans config/jobs /

Je ne comprends vraiment pas comment je suis supposé exiger le fichier my_file.rb dans ce fichier.

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

Cela me donne `require ': impossible de charger un tel fichier

Même erreur avec juste besoin de 'mon_module', ce que je fais dans mes contrôleurs ...

Quelqu'un ici pour m'expliquer? Merci beaucoup 

18
Zoz

Vous pouvez tout inclure dans la bibliothèque folder et éviter ces problèmes:

Tapez ceci votre fichier dans config/application.rb

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

si vous voulez n’exiger qu’un fichier spécifique,

faire quelque chose par rapport à Rails root comme celui-ci

for ex: --

lib/plan.rb

module Plan
 ...some code...
end

et si vous voulez l'exiger uniquement dans un modèle, dites app/models/user.rb

faire dans le modèle de l'utilisateur

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

class User < ActiveRecord::Base
  include Plan
end

si vous voulez qu'il soit disponible partout

une solution est donnée par @VecchiaSpugna

et vous pouvez également créer un fichier Ruby dans le dossier config/initializers

et exiger tous les fichiers là-bas un par un

OR

try this

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

instead of 

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

you don't need specify extension with require.
13
Sachin Singh

Je pense qu'il y a deux solutions.

1) Ajoutez le chemin de la bibliothèque au chemin de recherche . En Ruby:

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

Ensuite, vous pouvez require 'my_module.rb'

Je pense que Vecchia Spugna answer est la version Rails de ma réponse Ruby. (Je ne connais pas Rails).

2) Une autre solution:

Dans votre lib/my_module.rb, vous avez besoin de my_file. Ce fichier est situé par rapport à votre my_module.rb? Ensuite, utilisez require_relative:

require_relative './my_module/my_file'
6
knut

Similaire à require_relative,

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

Cela élargit le chemin du répertoire de fichier actuel et ajoute le chemin de fichier relatif à être requis.

0
konyak

Juste parce que ça m'a pris une éternité pour comprendre cela parce que très peu de solutions ont fonctionné. 

• Je devais utiliser tout simplement vieux besoin. Je le mets dans le fichier config/application.rb.

patching_file_path = File.expand_path("./lib", Dir.pwd) Dir[patching_file_path+'/*.rb'].each {|file| require file }

• Je mets également un puts "I'm Working! temporaire dans le fichier que je tente d'exiger afin de pouvoir vérifier si la console est en cours de chargement. 

• En outre, si vous utilisez un chargeur à ressort, avant de démarrer votre console, vous devez insérer bin/spring stop dans votre terminal avant de démarrer votre console Rails. Sinon, il ne chargera pas de nouveaux fichiers. 

0
stephennelson