2012-03-28 105 views
0

我有一個2級嵌套對象,我需要幫助Rails 3嵌套

我的路線看起來像這樣來規範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級嵌套時通常會如何處理?

回答

2

我會做

resources :projects, :shallow => true do 
    resources :tasks do 
    resources :comments 
    end 
end 

這是除了你自己在做什麼基本上不能產生projects_task成員路徑(即projects/1/tasks/1)了,他們會都只是task組成路徑(即「/任務/ 1'​​ )。
會員路徑包括showupdatedeleteedit

project_tasks收集路徑(即projects/1/tasks)仍然是可用的。
收集路徑包括indexcreatenew

comment路徑不會改變。 所有comment路徑仍將包含前綴task/:task_id

結帳的resources documentation更多信息上(上membercollection也該網頁上還詳細信息。)

但要真正解決你的問題

你需要查找的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 
+0

這很好,你的解決方案,這是否意味着我仍然需要重新安排我的資源,如你的例子?將在控制器中找到項目ID並分配'project_tasks_path(@project,@task)也可以工作? – user979587 2012-03-28 04:32:27

+0

您不必重新排列代碼,這只是一個建議。是的,你可以在你的控制器中設置一個'@ project'變量並且這樣做,但是因爲你要去'project_tasks'集合'index'路由,所以你只需要'@project'變量。如果你要去'project **'''''''''''''show''路由,那麼你需要'(@project,@task)'參數。 – Azolo 2012-03-28 04:46:12

+0

對不起,我實際上要去任務展示,所以評論的父母。那意味着我需要做更晚的事情,我如何在控制器中分配項目變量?它會是這樣的@project = Project.find(params [:task.project])??? – user979587 2012-03-28 05:59:54