La magia di roba a caricamento automatico
Penso che l'opzione che controlla le cartelle da cui viene eseguito il caricamento automatico sia stata sufficientemente trattata in altre risposte. Tuttavia, nel caso in cui qualcun altro abbia dei problemi caricati anche se i loro percorsi di caricamento automatico sono stati modificati come richiesto, allora questa risposta cerca di spiegare qual è la magia dietro questa cosa di caricamento automatico.
Quindi, quando si tratta di caricare materiale da sottodirectory, c'è un gotcha o una convenzione che dovresti conoscere. A volte la magia di Ruby / Rails (questa volta principalmente Rails) può rendere difficile capire perché sta accadendo qualcosa. Qualsiasi modulo dichiarato nei percorsi di caricamento automatico verrà caricato solo se il nome del modulo corrisponde al nome della directory principale. Quindi nel caso in cui provi a inserire lib/my_stuff/bar.rb
qualcosa come:
module Foo
class Bar
end
end
Non verrà caricato automaticamente. Poi di nuovo se si rinomina il dir genitore per foo
ospitare così il modulo nel percorso: lib/foo/bar.rb
. Sarà lì per te. Un'altra opzione è quella di nominare il file che si desidera caricare automaticamente dal nome del modulo. Ovviamente ci può essere solo un file con quel nome allora. Nel caso in cui sia necessario dividere le tue cose in molti file, puoi ovviamente usare quel file per richiedere altri file, ma non lo consiglio, perché quando si è in modalità di sviluppo e si modificano quegli altri file, Rails non è in grado di automagicamente ricaricali per te. Ma se vuoi davvero potresti avere un file con il nome del modulo che specifica quindi i file effettivi richiesti per usare il modulo. Quindi potresti avere due file: lib/my_stuff/bar.rb
e lib/my_stuff/foo.rb
il primo è lo stesso di sopra e il secondo contenente una sola riga:require "bar"
e funzionerebbe allo stesso modo.
PS Mi sento in dovere di aggiungere un'altra cosa importante. Di recente, ogni volta che voglio avere qualcosa nella directory lib che deve essere caricato automaticamente, tendo a iniziare a pensare che se questo è qualcosa che sto effettivamente sviluppando specificamente per questo progetto (che di solito è, potrebbe un giorno si trasforma in uno snippet di codice "statico" usato in molti progetti o in un sottomodulo git, ecc. nel qual caso dovrebbe sicuramente trovarsi nella cartella lib) quindi forse il suo posto non è affatto nella cartella lib. Forse dovrebbe essere in una sottocartella sotto la cartella dell'app · Ho la sensazione che questo sia il nuovo modo di fare le rotaie. Ovviamente, la stessa magia è attiva ovunque nei tuoi percorsi di caricamento automatico in cui metti le tue cose, quindi è buono con queste cose. Comunque, questo è solo il mio pensiero sull'argomento. Sei libero di non essere d'accordo. :)
AGGIORNAMENTO: informazioni sul tipo di magia ..
Come ha sottolineato Severin nel suo commento, il nucleo "carica automaticamente un meccanismo del modulo" fa sicuramente parte di Ruby, ma la roba dei percorsi di caricamento automatico non lo è. Non hai bisogno di Rails per farloautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. E quando proveresti a fare riferimento al modulo Foo per la prima volta, verrà caricato per te. Tuttavia, ciò che fa Rails è che ci dà un modo per provare a caricare roba automagicamente da cartelle registrate e questo è stato implementato in modo tale che deve assumere qualcosa sulle convenzioni di denominazione. Se non fosse stato implementato in quel modo, ogni volta che fai riferimento a qualcosa che non è attualmente caricato dovrebbe passare attraverso tutti i file in tutte le cartelle di caricamento automatico e verificare se qualcuno di essi contiene ciò a cui stavi cercando di fare riferimento. Questo a sua volta vanificherebbe l'idea del caricamento automatico e del caricamento automatico. Tuttavia, con queste convenzioni in atto, è possibile dedurre dal modulo / classe il tentativo di caricare dove potrebbe essere definito e caricarlo.
app/lib
.