2012-12-23 74 views
0

我有兩個控制器:工人和任務。與兩個控制器的會話

views/workers/index包含:

<% @workers.group_by(&:name).each do |name, workers| %> 
    <tr> 
    <td><%= name %></td> 
    <td><%= workers.size %></td> 
    </tr> 
<% end %> 

它顯示了我所有的工人和他們的任務數。

我想補充一個又一個< TD>名爲:「顯示所有任務」,並表示工人X的所有任務

爲了做到這一點,我想,我需要這樣的東西:

<td><%= link_to 'show all tasks', worker_task_path(name) %></td> 

因此,我有tasks_controller

def index 
    @task = Worker.where(:name => params[:id]) respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @worker } 
    end 
end 

這是views/tasks/index

<% @task.each do |task| %> 
    <tr> 
    <td><%= task.name %></td> 
    <td><%= task.task %></td> 
    <td><%= task.done %></td> 
    </tr> 
<% end %> 

另外,我定義routes.rb

TODO::Application.routes.draw do 
    #resources :workers 
    #root to:"workers#index" 

    match '/workers/:id/index', :to => 'tasks#index', :as => 'index_task' 

    resources :workers do 
    resources :tasks 

end 

我覺得我沒有正確定義的routes.rb,因爲我的錯誤是

Routing Error 

No route matches {:action=>"show", :controller=>"tasks", :worker_id=>"alon"} 
Try running rake routes for more information on available routes. 

回答

1

首先,您可以通過刪除不必要的match指令來簡化路線。通過聲明:

resources :workers do 
    resources :tasks 
end 

您將任務資源嵌套到工作者資源中。然後,您的任務指標將使用可訪問:

workers/:id/tasks 

其中id是你的工人模型的主鍵。

Rails路徑助手對單數/複數形式敏感。 link_to調用中的路徑對應於包含任務列表(複數)的特定工作人員(單數)。 Rails路由器需要一個主鍵或模型實例作爲ID參數:

<%= link_to 'All tasks', worker_tasks_path(worker) %> 
or 
<%= link_to 'All tasks', worker_tasks_path(worker.id) %> 
+0

謝謝!它幾乎可以工作。我的問題是(例如),如果我按下Alon工作人員的「顯示任務」,我將被引導至:http:// localhost:3000/workers/alon/tasks 並且此頁面爲空白顯示我的任務索引頁面。 –

+1

Rails的默認行爲是使用(數字)主鍵構建資源路徑。如果你想擁有一個友好的URL而不是'workers/1/tasks',你可以考慮使用friendly_id gem:https://github.com/norman/friendly_id。 – Jef