2011-04-10 99 views
3

我工作的一个的Rails 3任务演示项目中的Project每个实例有很多tasks,和Task实例属于一个project。然而,后一种关系是可选的,尽管它在Task模型中定义为belongs_to :project可选belongs_to的和Rails路由

从本质上讲,我希望能够有像以下途径:

example.com/tasks/1 
example.com/tasks/new 

example.com/project/1/tasks/1 
example.com/project/1/tasks/new 

我不知道这是可能的,甚至好的做法。真的,最重要的是我能够从一般的tasks#index动作中创建无项目任务,并通过new动作的链接从project#show动作中属于某个项目的任务。

我读过Rails Routing from the Outside In,但它并没有真正解释我要做什么。

任何帮助将不胜感激。

回答

3

这实际上比您想象的更常见。这里是一个解决方案:

class TasksController < ApplicationController 
before_filter :get_project 
before_filter :get_tasks 


    private 

    def get_project 
    @project = Project.find(params[:project_id]) if params[:project_id] 
    end 

    def get_tasks 
    @tasks = (@project) ? @project.tasks : Task 
    end 

end 

从那里你,你总是会引用@tasks当你想要获得任务。

因此,对于一个例子:

def new 
    @tasks.new(params[:task]) 
end 

会产生正确的结果,不管你是嵌套与否。

在嵌套的情况下,它会像调用:

@projects.tasks.new(params[:task]) 

,没有嵌套,它会像调用:

Task.new(params[:task]) 
+0

你可以这样做:Project.tasks.create(PARAMS [:tasks] .merge({:project_id => params [:id]})其中params [:task]只是一个散列,你会传入#create。 – 2011-04-11 00:46:58

+0

明白了你的意见,与设计。建立路线后,我真的不需要改变超出我原来的东西,除了新的link_t标签是'link_to'新任务',@project? “#{@project.id}/tasks/new”:new_task_path' – clem 2011-04-11 00:53:09

+0

真棒,很高兴听到! – 2011-04-11 00:59:38

0

这些路线与协会无关。即使你没有任何关联,你也可以拥有任何你喜欢的路线。你的路线看起来不错。

该协会是一个方便的事情。它使程序员的生活更轻松。如果你甚至需要写这样的东西:

task.projects 

然后,你必须有一个has_many(或其他)任务/项目之间的关联。这有很多是允许你做task.projects的。如果你没有这个联系,你将不得不使用取景器。