Rails 5嵌套路由配置:Task仅嵌套于Card,Card嵌套于Project
解决方案
要实现这个需求,你只需要把Task的路由从Project的嵌套结构中抽出来,单独定义为Card的嵌套路由即可,同时保留Card在Project下的嵌套配置。具体代码如下:
# config/routes.rb resources :projects, except: [:new, :edit, :show] do # 保留Card与Project的嵌套关系,但移除内部的Task路由 resources :cards end # 单独定义Task仅嵌套于Card的路由 # 使用only: []是因为我们不需要Card本身的独立路由(比如/cards),只需要嵌套的Task路由 resources :cards, only: [] do resources :tasks end
为什么这么做?
- 第一段路由配置保持了
Project和Card的关联,生成的Card路径依然是projects/:project_id/cards及相关RESTful路由(比如projects/:project_id/cards/:id)。 - 第二段路由通过
resources :cards, only: []创建了一个仅用于嵌套的Card路由容器,不会生成Card自身的独立路由(比如/cards或/cards/:id),但会生成Task的路由:cards/:card_id/tasks、cards/:card_id/tasks/:id等,完全符合你的需求。
控制器调整
接下来你需要修改TasksController中的代码,因为现在不再通过Project来查找Card了:
原来的代码可能类似:
# app/controllers/tasks_controller.rb def create @project = Project.find(params[:project_id]) @card = @project.cards.find(params[:card_id]) @task = @card.tasks.build(task_params) # ... end
现在改成直接通过card_id查找Card:
def create @card = Card.find(params[:card_id]) @task = @card.tasks.build(task_params) # ... end
其他动作(比如index、show、update、destroy)也需要做类似调整,移除对params[:project_id]的依赖。
验证路由配置
你可以通过运行Rails内置的路由查看命令来确认生成的路由是否符合预期:
rails routes | grep task
你应该会看到类似这样的输出:
card_tasks GET /cards/:card_id/tasks(.:format) tasks#index POST /cards/:card_id/tasks(.:format) tasks#create new_card_task GET /cards/:card_id/tasks/new(.:format) tasks#new edit_card_task GET /cards/:card_id/tasks/:id/edit(.:format) tasks#edit card_task GET /cards/:card_id/tasks/:id(.:format) tasks#show PATCH /cards/:card_id/tasks/:id(.:format) tasks#update PUT /cards/:card_id/tasks/:id(.:format) tasks#update DELETE /cards/:card_id/tasks/:id(.:format) tasks#destroy
而Card的路由依然是嵌套在Project下的:
rails routes | grep card
会输出:
project_cards GET /projects/:project_id/cards(.:format) cards#index POST /projects/:project_id/cards(.:format) cards#create new_project_card GET /projects/:project_id/cards/new(.:format) cards#new edit_project_card GET /projects/:project_id/cards/:id/edit(.:format) cards#edit project_card GET /projects/:project_id/cards/:id(.:format) cards#show PATCH /projects/:project_id/cards/:id(.:format) cards#update PUT /projects/:project_id/cards/:id(.:format) cards#update DELETE /projects/:project_id/cards/:id(.:format) cards#destroy ...
这样就完美实现了你要的路由结构啦!
内容的提问来源于stack exchange,提问作者Emu
相关产品推荐
相关产品推荐

