Se si digita script/console
nel progetto Rails e immettere $:
, si otterrà un array include tutte le directory necessarie per caricare Ruby. Il take-away di questo piccolo esercizio è che $:
è un array. In tal caso, è possibile eseguire le funzioni su di esso come anteporre altre directory al metodo unshift
o all'operatore <<
. Come hai sottinteso nella tua dichiarazione $:
e $LOAD_PATH
sono gli stessi.
Lo svantaggio di farlo in modo rapido e sporco come hai detto è questo: se hai già la directory nel tuo percorso di avvio, si ripeterà.
Esempio:
Ho un plugin che ho creato chiamato todo. Il mio elenco è strutturato in questo modo:
/---vendor
|
|---/plugins
|
|---/todo
|
|---/lib
|
|---/app
|
|---/models
|---/controllers
|
|---/rails
|
|---init.rb
Nel file init.rb ho inserito il seguente codice:
## In vendor/plugins/todo/rails/init.rb
%w{ models controllers models }.each do |dir|
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
noti come dico il blocco di codice per eseguire le azioni all'interno del blocco alle corde 'modelli', 'controller' e 'modelli', dove ripeto 'modelli'. (FYI, %w{ ... }
è solo un altro modo per dire a Ruby di tenere una serie di stringhe). Quando eseguo script/console
, digito il seguente:
>> puts $:
E ho questo tipo in modo che sia più facile da leggere il contenuto della stringa. L'output che ottengo è:
...
...
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
Come si può vedere, anche se questo è il più semplice esempio ho potuto creare durante l'utilizzo di un progetto che sto attualmente lavorando su, se non stai attento il modo rapido e sporco porterà a percorsi ripetuti. Il modo più lungo controllerà i percorsi ripetuti e si assicurerà che non si verifichino.
Se sei un programmatore esperto di Rails, probabilmente hai una buona idea di quello che stai facendo e probabilmente non commetti l'errore di ripetere percorsi. Se sei un principiante, andrei con il lungo cammino finché non capirai davvero cosa stai facendo.
A ** ** leggermente versione meno prolissa di colui verbose è:. 'File.expand_path (File.dirname (__ FILE __)) {toccare | pwd | $ LOAD_PATH.unshift (pwd) a meno che $ LOAD_PATH.include? (Pwd)} ' –
come si parla della clausola" unless "? Come possono i due sopra essere equivalenti? – inger
Come qualcuno che è venuto qui per cercare di capire come usarlo, è super criptico. Non vedo da dove proviene il nome della directory sugli esempi. Apprezzerei se qualcuno potesse chiarirlo. – SlySherZ