この質問が最初に尋ねられてから久しぶりのことですが、共有したい追加の回答があります。
別のプログラマーが数年かけて開発したRubyアプリケーションがいくつかあり、それらは同じデータベースにアクセスする可能性がありますが、異なるアプリケーションで同じクラスを再利用しています。これはDRYルールに違反しているため、すべてのRubyアプリケーションで共有されるクラスライブラリを作成することにしました。メインのRubyライブラリに配置することもできましたが、それによって、私がやりたくなかった一般的なコードベースにカスタムコードが隠されてしまいます。
既に定義されている名前 "profile.rb"と使用しているクラスの名前が競合するという問題がありました。この競合は、共通のコードライブラリを作成しようとするまで問題になりませんでした。通常、Rubyは最初にアプリケーションの場所を検索し、次に$ LOAD_PATHの場所に移動します。
application_controller.rbは、作成したクラスを見つけることができませんでした。クラスではないため、元の定義でエラーが発生しました。アプリケーションのapp / modelsセクションからクラス定義を削除したので、Rubyはそれを見つけることができず、Rubyパスで探しました。
そこで、$ LOAD_PATH変数を変更して、使用していたライブラリディレクトリへのパスを含めました。これは、初期化時にenvironment.rbファイルで行うことができます。
検索パスに新しいディレクトリを追加しても、Rubyはシステム定義ファイルを優先的に取得するため、エラーをスローしていました。$ LOAD_PATH変数の検索パスは、Rubyパスを最初に優先的に検索します。
そのため、Rubyが組み込みライブラリを検索する前に、私のライブラリでクラスを見つけられるように、検索順序を変更する必要がありました。
このコードは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
このレベルではこれまでに提供された高度なコーディング構造を使用できないと思いますが、アプリの初期化時に何かをセットアップしたい場合は問題なく動作します。元の$ LOAD_PATH変数を新しい変数に追加するときに元の順序を維持する必要があります。そうしないと、いくつかの主要なRubyクラスが失われます。
application_controller.rbファイルでは、単に
require 'profile'
require 'etc' #etc
これにより、アプリケーション全体のカスタムライブラリファイルが読み込まれます。つまり、すべてのコントローラーでrequireコマンドを使用する必要はありません。
私にとって、これは私が探していた解決策であり、この回答に追加して情報を渡すことを考えました。
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}