1

我正在構建一個ToDo應用程序,試圖獲得流利的Rails。我的應用中有四個級別的層次結構。使用form_for與嵌套資源

  1. 用戶
  2. 目標(每個用戶的多個目標)
  3. 任務(每個目標多任務)
  4. 子任務(每個任務的多個子任務)

我有一個工作的前端形式對於每個使用嵌套資源的應用程序。我的routes.rb有這樣的事情

resources :goal do 
    resources :task do 
    resources :subtask 
    end 
end 

我想現在要做的是,有所有這些形式的用戶控制器的一個觀點正確。

這是我試圖創建表格:

<%= form_for @task, url: {controller: 'task', action: 'create'} do |f| %> 

<%= f.label :description %> 

<%= f.text_field :description %> 

<%= f.submit "Add Goal", class: "btn" %> 

<% end %> 

但我最終得到這個錯誤

No route matches {:action=>"create", :controller=>"task", :id=>"1"} 

的:ID => 1對應於用戶頁面我在( http://localhost:3000/user/1

我的理解是,我沒有提供此步驟的目標goal_id。不知道如何實現這一點。

我注意到的另一件事是,對rake routes的響應顯示了很多URI路徑,但對POST方法沒有任何影響。它不允許我使用url:form_for中的路徑,因爲它與POST方法不匹配。

所以我的問題是:

  1. 如何路由的form_for,當你有嵌套的資源?
  2. 如何在使用form_for時提供父資源的ID,以便我的創建操作正確路由?
+0

大概這將給你一些想法:HTTP://計算器.com/questions/2034700/form-for-with-nested-resources – dp7

+0

執行rake路由並檢查創建任務路由。用戶ID可能不會被指示爲:id。 – Syl

+0

不,我有'/ goal /:goal_id/task'作爲創建任務路線。是的,在這條路線上沒有:id,我仍然需要在某處提供:goal_id,我不知道如何去做(正如我在問題中提到的那樣)。 –

回答

1

將路由嵌套到兩層以下通常是不好的做法。我會改變你的路線:

resources :goal do 
    resources :task 
    end 

resources :task do 
     resources :subtask 
    end 

現在,如果你在命令行中運行「捆綁高管耙路線」,你會看到所有的嵌套的路線及其相應的助手。你目前的問題在於form_for方法。您需要添加資源的嵌套與在這種情況下應該是:

<%= form_for [@goal,@task] do |f| %> 
    blah blah 
<% end %> 

最後,@goal也仍然不確定,所以你需要在你的任務「新」的行動來定義它控制器。這通常是通過傳遞您的任務將通過params散列關聯的目標的id和用於獲得「新」形式的「link_to」來完成的。然後在你的任務控制器中的新動作:

@goal = Goal.find(params[:goal_id]) #The parameter can be named anything 
@task = Task.new 
在「創建」行動

那麼你應該有該協會提出:

@task = Goal.tasks.new(task_params) 
if @task.save 
    flash[:success] = "Woot" 
    redirect_to somewhere_awesome_path 
else 
    whatever 
end 
+0

使用'form_for [@ goal,@ task]'給出錯誤'未定義的方法goal_tasks_path爲#<#

+0

感謝您的回覆,但它是一個很好的答案。只需要多一點你的幫助:) –

+0

沒問題。您想要在連接到顯示錶單的操作中定義'@goal'和'@task',所以在這種情況下,您可以在Show操作中的用戶控制器中定義它們。然後,您也可以像「url:{controller:'task',action:'create'}」部分那樣定義表單將要提交的路徑。至於傳遞goal_id,你可以將它作爲一個hidden_​​field添加到表單中的一個預設值。例如<%= f.hidden_​​field:目標,值:'任何值'%> – bkunzi01