1

この質問のタイトルは、名前を変更する必要がある場合があります。助言がありますか?

私の Rails アプリケーションでは、/lib フォルダーに foo_blaster.rb という古いモジュールがありました。次に、foo_blaster.rb という名前の gem をインストールしました。元の FooBlaster モジュールを削除するまで、gem のコードは実行されませんでした。どうしてこれなの?Ruby は 2 つのモジュールを結合するべきではありませんか?

モジュールは同じです

# lib/foo_blaster.rb
module FooBlaster
  class Characters
    puts "some characters"
  end
end

# foo_blaster gem files
module FooBlaster
   class Users
   end
end

FooBlaster::Characters #=> some characters
FooBlaster::Users #=> NameError: uninitialized constant FooBlaster::Users

ここで何が欠けていますか?

レール 2.3.18、ルビー 1.8.7-p358

4

2 に答える 2

4

コンソールを開いて変数script/consoleを調べると、次の$LOAD_PATHようなものが表示されるはずです。

>> $LOAD_PATH
[
  # some entries...
  [12] "/your/rails/root/app",
  [13] "/your/rails/root/app/controllers",
  [14] "/your/rails/root/app/models",
  [15] "/your/rails/root/app/helpers",
  [16] "/your/rails/root/lib",
  # more entries...
  [27] "/your/ruby/path/lib/ruby/1.8/gems/foo_blaster-0.0.1/lib"
  # rest of entries
]

require 'foo_blaster'(Rails、Bundler、またはおそらく他の手段によって暗黙的に行われる場合があります)、Ruby はファイル foo_blaster.rb が見つかるまで場所を順番に検索し、その$LOAD_PATHファイルをロードして停止します。あなたの場合、アプリケーションの /lib ディレクトリでファイルを見つけます。gem のファイルが読み込まれることはありません。

両方のファイルをロードしたい場合は、それらに異なる名前を付けてrequire、両方を確認するだけです。たとえば、アプリケーション内のファイルの名前を foo_blaster_extensions.rb に変更し、初期化子を追加してロードすることができます。

# config/initializers/extend_foo_blaster.rb
require 'foo_blaster_extensions'
于 2013-05-17T19:37:23.633 に答える
0

コアアプリで同名ファイルが必要な場合があります。gem を作成するときは、ベスト プラクティスに従う必要があります。つまり、gem に名前を付ける必要があります。その場合、コア アプリケーションとの競合は発生しません。

于 2016-07-19T11:23:30.493 に答える