同じ名前のrubyソースファイルを扱う正しい方法と、適切なファイルが指定されたrequire
文でロードされるようにするにはどうすればよいですか?Rubyのソースファイル名と `require`との衝突
背景
私は私のRails 3アプリケーションで ruby-geometry宝石を利用したい。
私はルビージオメトリPolygon
クラスを利用するようにしようとしています:
require 'geometry' # the main ruby-geometry gem file
module SomeModule
def SomeMethod(vertices)
polygon = Geometry::Polygon.new(vertices)
# Do some stuff with polygon...
end
end
私はこのコードを実行しようとするたびしかし、私は次のエラーを取得:
NameError: uninitialized constant Geometry::Polygon
を問題なく他のルビジオメトリクラス(例えばGeometry::Point
、Geometry::Segment
)を使って作業できるように思われるので、これは奇妙です。
問題
問題は、私のアプリは、ソースpolygon.rb
という名前のファイル(ActiveRecordのモデルが含まれている)とso does the ruby-geometry gemが含まれていることです。だから、ルビージオメトリの宝石require
s its own polygon.rb
は、代わりに私のアプリのpolygon.rb
の読み込みを終了します。おそらく、これはすべて、ルビがディレクトリを検索する順番です。
この名前の衝突を解決するための「適切な」アプローチとは何ですか?
明らかにのコードでは、モジュールを使用して名前空間を区別してクラス名の衝突を解決できます。 require
を実行すると、同じ名前のソースファイルを簡単に区別することはできますか?
コードファイルの名前を変更できませんか?なぜこれはオプションではないのですか?それはそれを行う最も簡単な方法でしょう。それを 'polygon_record.rb'などの名前に変更してください。 – Linuxios
これはオプションですが、これを行うのは 'require'メカニズムが壊れていることを認めているようです。ソースファイルに名前を付けることができるはずですが、私のアプリケーションが依存するn個の宝石の中のソースファイルと名前が衝突しないようにする必要はありません。さらに、2つの宝石(私は簡単に名前を変更できません)のソースファイルの間に衝突がある場合はどうなりますか?私はもっと良い解決策がないとは信じられません。 – tomtheguvnor
本当にモデルの名前を変更したくない場合は絶対に絶対パスでファイルを要求することができますが、私はそれをお勧めしません。 –