我有一个2级嵌套对象,我需要帮助
我的路线看起来像这样规范化url abit。而不是有一个类似于/ projects / 1 / tasks / 3 / comments / 3的网址。
resources :projects do
resources :tasks
end
resources :tasks do
resources :comments
end
模型具有'has_many',belongs_to方法。
我可以在每个任务下创建注释并在任务下显示它们,但是在评论的“show”模板上我想显示一个返回任务的链接,我得到一个错误,因为任务控制器正在询问对于project_id?
在处理2级嵌套时,这通常会怎么做?
答案 0 :(得分:2)
我愿意
resources :projects, :shallow => true do
resources :tasks do
resources :comments
end
end
基本上你正在做的事情除了你不能生成projects_task
成员路径(即projects/1/tasks/1
)之外他们都只是task
成员路径(即' /任务/ 1' )。
会员路径包括show
,update
,delete
,edit
但project_tasks
收集路径(即projects/1/tasks
)仍然可用
收集路径包括index
,create
,new
comment
路径不会改变。 所有comment
路径仍包含task/:task_id
前缀。
结帐resources
documentation了解更多相关信息(此页面上的member
和collection
也有更多信息。)
但要真正解决您的问题
当您链接回project_id
索引时,您需要查找project_tasks
。所以你需要做
<%= link_to "Project Tasks Index", project_tasks_path(@task.project) %>
这样Task#index
知道父项目的位置。这是两种实现的解决方案。
查看UrlFor
documentation了解更多信息。
如果您想在@project
视图中访问Comment
变量
然后你只需要在控制器中查找project
而不是在视图级别。所以基本上
class CommentsController < ApplicationController
def show
@task = Task.find(params[:task_id])
@comment = @task.comments.find([:id])
@project = @task.project
end
end