Rails 3嵌套

时间:2012-03-28 02:34:59

标签: ruby-on-rails ruby-on-rails-3.1

我有一个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级嵌套时,这通常会怎么做?

1 个答案:

答案 0 :(得分: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