So che è passato molto tempo da quando questa domanda è stata posta per la prima volta, ma ho un'ulteriore risposta che voglio condividere.
Ho diverse applicazioni Ruby che sono state sviluppate da un altro programmatore nel corso di diversi anni, e riutilizzano le stesse classi nelle diverse applicazioni sebbene possano accedere allo stesso database. Poiché ciò viola la regola DRY, ho deciso di creare una libreria di classi da condividere con tutte le applicazioni Ruby. Avrei potuto metterlo nella libreria Ruby principale, ma questo avrebbe nascosto il codice personalizzato nella base di codice comune, cosa che non volevo fare.
Ho avuto un problema in cui ho avuto un conflitto di nomi tra un nome già definito "profile.rb" e una classe che stavo usando. Questo conflitto non è stato un problema finché non ho provato a creare la libreria di codice comune. Normalmente, Ruby cerca prima le posizioni delle applicazioni, quindi va nelle posizioni $ LOAD_PATH.
Application_controller.rb non è riuscito a trovare la classe che ho creato e ha generato un errore sulla definizione originale perché non è una classe. Poiché ho rimosso la definizione della classe dalla sezione app / models dell'applicazione, Ruby non è riuscita a trovarla e l'ho cercata nei percorsi di Ruby.
Quindi, ho modificato la variabile $ LOAD_PATH per includere un percorso alla directory della libreria che stavo utilizzando. Questo può essere fatto nel file environment.rb al momento dell'inizializzazione.
Anche con la nuova directory aggiunta al percorso di ricerca, Ruby generava un errore perché preferibilmente prendeva per primo il file definito dal sistema. Il percorso di ricerca nella variabile $ LOAD_PATH cerca preferenzialmente prima i percorsi di Ruby.
Quindi, avevo bisogno di cambiare l'ordine di ricerca in modo che Ruby trovasse la classe nella mia libreria comune prima di cercare nelle librerie incorporate.
Questo codice lo ha fatto nel file environment.rb:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
Non penso che tu possa utilizzare nessuno dei costrutti di codifica avanzati forniti in precedenza a questo livello, ma funziona perfettamente se vuoi impostare qualcosa al momento dell'inizializzazione nella tua app. È necessario mantenere l'ordine originale della variabile $ LOAD_PATH originale quando viene aggiunta di nuovo alla nuova variabile altrimenti alcune delle classi principali di Ruby vanno perse.
Nel file application_controller.rb, utilizzo semplicemente un file
require 'profile'
require 'etc' #etc
e questo carica i file della libreria personalizzata per l'intera applicazione, cioè non devo usare i comandi require in ogni controller.
Per me, questa era la soluzione che stavo cercando e ho pensato di aggiungerla a questa risposta per passare le informazioni.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}