我正在一个项目中,我有一个Rails应用程序(rails 4.2.5),其中包含一个gem,这是一个Rails Engine。我目前正在将路线定义从主应用程序移动到gem。我有一个执行其中一条路线的控制器测试。将路线定义移至gem时,测试失败,但是路线看起来相同。
我的宝石称为CallCenter,其中包括一个名为call_center_controller的控制器(其动作为reports_tab)。这是在Rails应用中的route.rb外观:
...
mount CallCenter::Engine, at: "/call_center", as: 'call_center_urls'
get '/call_center/reports_tab' => 'call_center/call_center#reports_tab'
...
这是我要运行的耙路:
❯❯❯ rake routes | grep reports_tab
call_center_reports_tab GET /call_center/reports_tab(.:format) call_center/call_center#reports_tab
此时,控制器测试运行无误。但是,当我将路线定义移至gem中的routes.rb文件时:
get 'call_center/reports_tab' => 'call_center#reports_tab'
((请注意,路由现在指向'call_center#reports_tab'而不是'call_center / call_center#reports_tab',因为主应用程序将引擎安装在/ call_center上)
这是我从耙路的输出,(仍从主应用程序的目录运行)
❯❯❯ rake routes | grep reports_tab
call_center_reports_tab GET /call_center/reports_tab(.:format) call_center/call_center#reports_tab
这与在主应用程序中定义的耙路径报告的路径相同,但是现在我的测试失败,并显示以下消息:
Failure/Error: get :reports_tab
ActionController::UrlGenerationError:
No route matches {:action=>"reports_tab", :controller=>"call_center/call_center"}
据我所知,路由已定义,并且看起来与之前在主应用程序的路由文件中的样子完全相同。我想念什么?
我找到了答案-我需要将其添加到我的控制器规格中,以告诉它查看引擎提供的路由:
routes { CallCenter::Engine.routes }