Ich weiß, dass diese Frage schon lange nicht mehr gestellt wurde, aber ich habe eine zusätzliche Antwort, die ich teilen möchte.
Ich habe mehrere Ruby-Anwendungen, die über mehrere Jahre von einem anderen Programmierer entwickelt wurden, und sie verwenden dieselben Klassen in den verschiedenen Anwendungen erneut, obwohl sie möglicherweise auf dieselbe Datenbank zugreifen. Da dies gegen die DRY-Regel verstößt, habe ich beschlossen, eine Klassenbibliothek zu erstellen, die von allen Ruby-Anwendungen gemeinsam genutzt wird. Ich hätte es in die Ruby-Hauptbibliothek stellen können, aber das würde benutzerdefinierten Code in der allgemeinen Codebasis verbergen, was ich nicht wollte.
Ich hatte ein Problem, bei dem ein Namenskonflikt zwischen einem bereits definierten Namen "profile.rb" und einer von mir verwendeten Klasse bestand. Dieser Konflikt war kein Problem, bis ich versuchte, die allgemeine Codebibliothek zu erstellen. Normalerweise durchsucht Ruby zuerst die Anwendungsspeicherorte und wechselt dann zu den Speicherorten $ LOAD_PATH.
Die application_controller.rb konnte die von mir erstellte Klasse nicht finden und hat einen Fehler in der ursprünglichen Definition ausgelöst, da es sich nicht um eine Klasse handelt. Da ich die Klassendefinition aus dem Abschnitt app / models der Anwendung entfernt habe, konnte Ruby sie dort nicht finden und suchte sie in den Ruby-Pfaden.
Daher habe ich die Variable $ LOAD_PATH so geändert, dass sie einen Pfad zu dem von mir verwendeten Bibliotheksverzeichnis enthält. Dies kann zur Initialisierungszeit in der Datei environment.rb erfolgen.
Selbst mit dem neuen Verzeichnis, das dem Suchpfad hinzugefügt wurde, gab Ruby einen Fehler aus, da die systemdefinierte Datei bevorzugt zuerst verwendet wurde. Der Suchpfad in der Variablen $ LOAD_PATH durchsucht vorzugsweise zuerst die Ruby-Pfade.
Daher musste ich die Suchreihenfolge ändern, damit Ruby die Klasse in meiner gemeinsamen Bibliothek fand, bevor sie die integrierten Bibliotheken durchsuchte.
Dieser Code hat es in der Datei environment.rb getan:
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
Ich glaube nicht, dass Sie eines der zuvor auf dieser Ebene angegebenen erweiterten Codierungskonstrukte verwenden können, aber es funktioniert einwandfrei, wenn Sie zur Initialisierungszeit etwas in Ihrer App einrichten möchten. Sie müssen die ursprüngliche Reihenfolge der ursprünglichen Variablen $ LOAD_PATH beibehalten, wenn sie wieder zur neuen Variablen hinzugefügt wird, da sonst einige der wichtigsten Ruby-Klassen verloren gehen.
In der Datei application_controller.rb verwende ich einfach a
require 'profile'
require 'etc' #etc
Dadurch werden die benutzerdefinierten Bibliotheksdateien für die gesamte Anwendung geladen, dh ich muss nicht in jedem Controller erforderliche Befehle verwenden.
Für mich war dies die Lösung, nach der ich gesucht hatte, und ich dachte, ich würde sie dieser Antwort hinzufügen, um die Informationen weiterzugeben.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}