私の環境:
- レール 3.2.8
- ルビー 1.9.3p194
- フェドラ 16 x86_64
この問題は、Rails Engine に固有のようです。
Rails Engine の routes ファイルで を使用するHttpHelpers
と、ブラウザ経由でルートにアクセスすると「uninitialized constant Controller」が表示されるようです。しかし、エンジンのルート ファイルで URL マッチャーを使用すると、正しくルーティングされます。
失敗する例を作成する方法は次のとおりです。
$ rails plugin new my_engine --mountable
$ cd my_engine
$ rails g controller things index
$ rails s -p 3005
コントローラー ジェネレーターはHttpHelpers#get
デフォルトでこのメソッドを使用するため、この時点で Rails エンジンのconfig/routes.rb
ファイルは次のようになります。
MyEngine::Engine.routes.draw do
get "things/index"
end
また、test/dummy
アプリケーションのconfig/routes.rb
ファイルは次のようになります。
Rails.application.routes.draw do
mount MyEngine::Engine => "/my_engine"
end
それで、エンジンからThings#indexhttp://locahost:3005/my_engine/things/index
ビューをヒットして見ることができるはずです。しかし、代わりにブラウザに次のように表示されます。
ルーティング エラー
初期化されていない定数 ThingsController
エンジンのconfig/routes.rb
ファイルを次のように手動で変更した場合:
MyEngine::Engine.routes.draw do
#get "things/index"
match "things/index" => "things#index"
end
... を押すhttp://locahost:3005/my_engine/things/index
と、正しいThings#indexビューが表示されます。
HttpHelpers#get
エンジンのconfig/routes.rb
ファイルでメソッドを使用し、ディレクトリrake routes
から実行すると、次のように表示されることに気付きました。test/dummy
$ rake routes
my_engine /my_engine MyEngine::Engine
Routes for MyEngine::Engine:
things_index GET /things/index(.:format) things#index
しかし、config/routes.rb
URL マッチャー メソッドを使用するようにエンジンのファイルを変更すると、次のように表示されます。
$ rake routes
my_engine /my_engine MyEngine::Engine
Routes for MyEngine::Engine:
things_index /things/index(.:format) my_engine/things#index
URL マッチャーを使用する場合、コントローラとアクションはエンジンの下で正しくネームスペース化されることに注意してください。一方、 を使用するHttpHelpers#get
と、コントローラーとアクションは名前空間がないように見えます。
だから、私の質問:私はここで何か間違ったことをしていますか?それとも、これはバグですか?
注: Rails の問題を検索しましたが、これに直接関連するものは見つかりませんでした。他にもエンジンとルーティングの問題がいくつか見られましたが。