2011-04-10 53 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的。如果你沒有這個聯繫,你將不得不使用取景器。