我的环境:
- 导轨 3.2.8
- 红宝石 1.9.3p194
- Fedora 16 x86_64
这个问题似乎是 Rails 引擎特有的。
似乎HttpHelpers
在 Rails 引擎的路由文件中使用时,我在通过浏览器访问路由时得到“未初始化的常量控制器”。但是,如果我在引擎的路由文件中使用 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
所以,我应该能够从引擎中点击http://locahost:3005/my_engine/things/index
并查看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 问题,没有看到任何与此直接相关的内容。虽然我确实看到了其他几个引擎和路由问题。