在Scope与Resource中配置Rails顶级路由的技术咨询
给你的Rails嵌套控制器配置路由(结合scope与resource)
没问题,我来帮你梳理怎么针对这几个不同层级的Journeys控制器配置路由,既能用scope和resource(s)合理组织结构,也能实现顶级路径的映射需求。
1. 顶级JourneysController的路由配置
这个最外层的控制器,直接在config/routes.rb里定义就行,要是想和其他路由区分得更清晰,也可以用scope包裹(不过直接定义更直观):
# 针对两个自定义动作的路由 get 'journeys/custom_1', to: 'journeys#custom_1' get 'journeys/custom_2', to: 'journeys#custom_2' # 要是以后加RESTful动作,用resources更规范(目前你的控制器只有两个自定义方法,所以only: []) resources :journeys, only: [] do get :custom_1, on: :collection get :custom_2, on: :collection end
2. Policies::JourneysController的路由
如果你想让这个控制器的index和show动作不带/policies前缀,直接用顶级路径,就用scope指定控制器命名空间:
scope controller: 'policies/journeys' do get 'journey_policies', to: :index, as: :journey_policies get 'journey_policies/:id', to: :show, as: :journey_policy end
这样用户访问/journey_policies就会触发Policies::JourneysController#index,而且生成的路由辅助方法journey_policies_path也很实用。
要是你想保留/policies前缀,用namespace更省心(它是scope的语法糖,自动帮你处理路径前缀和控制器命名空间):
namespace :policies do resources :journeys, only: [:index, :show] end # 生成的路由是 /policies/journeys (GET) 和 /policies/journeys/:id (GET)
3. Policies::Drivers::JourneysController的路由
针对司机相关的旅程政策控制器,同样有两种配置方式:
映射到顶级路径(用scope)
scope controller: 'policies/drivers/journeys' do get 'driver_journey_policies', to: :index, as: :driver_journey_policies # 假设你有show动作,就加上这条 get 'driver_journey_policies/:id', to: :show, as: :driver_journey_policy end
保留命名空间前缀(嵌套namespace)
namespace :policies do namespace :drivers do resources :journeys, only: [:index, :show] # 根据你实际的控制器动作调整 end end # 生成的路由是 /policies/drivers/journeys (GET) 这类带前缀的路径
4. Policies::Vehicles::JourneysController的路由
和司机控制器的配置逻辑完全一致:
顶级路径映射
scope controller: 'policies/vehicles/journeys' do get 'vehicle_journey_policies', to: :index, as: :vehicle_journey_policies get 'vehicle_journey_policies/:id', to: :show, as: :vehicle_journey_policy end
带命名空间前缀
namespace :policies do namespace :vehicles do resources :journeys, only: [:index, :show] end end # 生成的路由是 /policies/vehicles/journeys (GET) 等
关键技巧:用scope实现“顶级路径+命名空间控制器”的映射
如果你的核心需求是让命名空间下的控制器不用带前缀就能访问,核心就是用scope controller: '命名空间/控制器'这个写法——它帮你把指定路径绑定到嵌套控制器,同时不会给路径加额外前缀,完美实现你要的“在scope内部配置顶级路由”的需求。另外别忘了用as:选项生成清晰的路由辅助方法,后续在视图和控制器里调用会方便很多。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

