2010-08-13 18 views
1

J'écris un générateur Rails 3, mais les choses deviennent un peu compliquées alors j'aimerais extraire du code pour le mettre dans un fichier séparé.Rails 3: `require` dans un générateur

donc créer un fichier dans le dossier du générateur, et dans mon fichier générateur, je mets en tête:

require 'relative/path/to/my/code.rb' 

Mais quand je lance le générateur, il me dit qu'il ne trouve pas le fichier.

activesupport-3.0.0.rc/lib/active_support/dependencies.rb:219:in `require': no such file to load -- relative/path/to/my/code.rb (LoadError) 

Est-ce que quelqu'un sait?

Répondre

2

Cela dépend de la version de Ruby que vous utilisez.

Dans 1.8, cela devrait fonctionner comme vous le faites. Dans 1.9, vous devez utiliser require_relative.

Vous ne devriez pas ajouter '.rb' à la fin, ce n'est pas recommandé.

Le danger avec un simple « besoin » avec un chemin relatif est si ce script lui-même est requis par un autre, le chemin sera par rapport au premier script appelé:

rootdir 
    - main.rb 
    - subdir1 
    - second.rb 
    - subdir11 
     - third.rb 

Si main.rb est appelé, puis exiger second.rb (avec 'subdir1/second'), puis vous souhaitez exiger third.rb avec 'subdir11/third.rb', cela ne fonctionnera pas.

Vous pourriez être relatif au premier script (subdir1/subdir11/third.rb), mais ce n'est pas une bonne idée. Vous pouvez utiliser __FILE__ puis faire un chemin absolu:

exigent File.expand_path ('../ subdir11/third.rb', FICHIER)

(le premier .. est d'obtenir dans le répertoire qui contient le fichier) ou

exigent File.dirname (fICHIER) + '/subdir11/third.rb'

Mais la pratique la plus courante consiste à la référencer à partir du répertoire racine.

Dans une gemme, vous pouvez supposer que le rootdir sera dans le $LOAD_PATH (ou vous pouvez l'ajouter vous-même).

Dans Rails, vous pouvez utiliser require "#{RAILS_ROOT}/path" (rails2) ou

require Rails.root.join('path') (rails3)

+0

Pourquoi le '.rb' non recommandé? Si elle n'est pas spécifiée, la méthode require essayera de toute façon de trouver le fichier '.rb', ou un '.so' ou un '.dll'. – glmxndr

+0

'recommandé' n'est probablement pas le bon mot, en effet. Mais c'est une pratique courante et je n'ai jamais vu de code l'utiliser, sauf quand il y a à la fois une bibliothèque partagée et un script ruby ​​avec le même nom. En outre, il semble très laid;) – eregon