Come fa Ruby a sapere dove trovare un file richiesto?
-
03-07-2019 - |
Domanda
Ecco un'altra domanda per principianti:
require 'tasks/rails'
Ho visto questa linea in Rakefile nel percorso principale di ogni progetto di rotaie. Immagino che questa riga sia utilizzata per richiedere il fornitore / rails / railties / lib / task / rails.rb per caricare tutte le attività di rake:
$VERBOSE = nil
# Load Rails rakefile extensions
Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext }
# Load any custom rakefile extensions
Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext }
La mia domanda è: perché è stato specificato solo 'task / rails' per il metodo request, ma non il percorso completo del file?
Grazie in anticipo.
Soluzione
Quando avvii l'app rails, viene eseguito config / boot.rb che chiama Rails::Initializer.set_load_path
e ripristina $LOAD_PATH
.
Ruby usa quell'elenco di directory per trovare i file specificati su una require
riga. Se gli dai un percorso assoluto come require '/home/lolindrath/ruby/lib.rb'
salterà quella ricerca.
Questo è approssimativamente analogo a #include <stdlib.h>
in C / C ++ dove cerca il percorso di inclusione che dai al compilatore per trovare quel file di intestazione.
Altri suggerimenti
Credo che i tuoi percorsi siano impostati nel tuo file /config/environment.rb:
require File.join(File.dirname(__FILE__), 'boot')
Certo. In /config/boot.rb (chiamato in environment.rb) RAILS_ROOT è impostato come segue:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
Che ti permette di richiedere cose dalla radice, credo. Spero che sia la risposta comunque!