2008-10-06 167 views
6

我有一个Rails应用程序,用于有Project和Task模型的项目管理。一个项目可以有很多任务,但任务也可以有很多任务,无限的。递归Rails嵌套资源

使用嵌套的资源,我们可以有/项目/ 1 /任务/项目/ 1 /任务/新/项目/ 1 /任务/ 3 /编辑等

但是,你怎么代表RESTfully的递归任务性质?我不想去另一个层次深,那么也许下面会做:

map.resources :tasks do |t| 
    t.resources :tasks 
end 

这将使我下面的网址:

/tasks/3/tasks/new 
/tasks/3/tasks/45/edit 

或者也许当它涉及到一个单独的任务,我可以只是使用/任务/ 45 /编辑

这是一个合理的设计?

凸轮

回答

3

没有理由他们应该有被告URLS。

逻辑:

 
/projects/1 --> project 1 
/projects/1/edit (etc) 
/tasks/1  --> task 1 
/project/1/tasks --> task list for project 1 
/project/1/tasks/new 
/project/1/tasks/1/edit -> /tasks/5/edit (redundancy) 
/project/1/tasks/1 -> redirect to /tasks/1 
/tasks/1/project -> redirect to /projects/1 
/tasks/3/tasks --> list of tasks that are children tasks of task 3 
/tasks/3/tasks/5 -> redirect /tasks/5/ (because you don't really need to have a recursive URL) 
/tasks/5/parents -> list of tasks that are parents of tasks 3 
/tasks/5/parents/3 -> redirect /tasks/3/ 

没有理由恕我直言,要求的URL是关联的,你不会需要知道任务5是任务3的子编辑任务5.

6

在单个嵌套路线之外的任何地方通常被认为是一个坏主意。

108页Rails的方式

"Jamis Busk a very influential figure in the Rails community, almost as much as David himself. In February 2007, vis his blog, he basically told us that deep nesting was a _bad_ thing, and proposed the following rule of thumb: Resources should never be nested more than one level deep."

现在有些人会用这个争论(这是109页上的讨论),但是当你在谈论嵌套任务与任务,它只是似乎没有多大意义。

我会用不同的方式处理你的解决方案,就像上面提到的那样,一个项目应该有很多任务,但是对于任务有很多任务看起来不正确,也许这些任务应该被重新命名为子任务或类似的规定。

2

我目前正在做一个类似的项目。我使用的答案非常优雅,我添加了一个指向另一个任务的parent_id列。在做模型时,一定要做到以下几点:

belongs_to :project 
belongs_to :parent, :class_name => "Task" 
has_many :children, :class_name => "Task", :foreign_key => "parent_id" 

...然后你可以做递归:

def do_something(task) 
    task.children.each do |child| 
    puts "Something!" 
    do_something(child) 
    end 
end  

这样,您就可以通过其父母或引用您的任务它的孩子。在做你的路线时,你总是可以访问一个任务

/project/:project_id/task/:task_id 

即使它可能有父母或子女。

只要确保你没有拥有它的父同其子任务,否则你将进入一个无限循环,当你做你的递归找到所有的孩子们。您可以将条件添加到您的验证脚本中,以确保它不会。

参见:acts_as_tree

+0

使用`acts_as_tree`将工作太,并给予额外的好处。 – 2008-10-06 23:42:13