1

私はTo Doアプリケーションをビルドして、Railsに慣れ親しんでいます。私のアプリには4つのレベルの階層があります。ネストされたリソースで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ルートAをへのリソース?
  2. 作成アクションが正しくルーティングされるようにform_forを使用している間に親リソースのIDを指定する方法はありますか?
+0

おそらくこれはあなたにいくつかのアイデアを与えるだろう.com/questions/2034700/form-for-nested-resources – dp7

+0

RAKEルートを実行し、作成タスクのルートを確認します。ユーザーIDは、おそらく:idとして示されていません。 – Syl

+0

いいえ私は '/ goal /:goal_id/task'を作成タスクルートとして持っています。はい、いいえ:このルートのID、私はまだ:goal_idどこかを提供する必要があり、私は質問に記載)を行う方法を知らない。 –

答えて

1

通常、2つのレベルを超えるルートをネストするのは悪い習慣です。あなたは、コマンドラインで「バンドルのexecすくいルート」を実行する場合は、ネストされたルートとそれに対応するヘルパーのすべてを見ることができます今すぐ

resources :goal do 
    resources :task 
    end 

resources :task do 
     resources :subtask 
    end 

:私はにあなたのルートを変更します。現在の問題は、form_forメソッドにあります。

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

、@goalもまだ定義されていますが、作業中に、あなたの「新しい」アクションでそれを定義する必要がありますので:あなたはどのでこのケースである必要があり、そのネストされたリソースを追加する必要がありますコントローラ。これは、通常、タスクが関連付けられるゴールのidをparamsハッシュで渡し、「link_to」が「新しい」フォームに到達することによって行われます。次に、あなたのタスクコントローラの新しいアクションで:

@goal = Goal.find(params[:goal_id]) #The parameter can be named anything 
@task = Task.new 

その後、あなたは関連付けがなされている必要がありますあなたの「作成」アクションでます。http:// stackoverflowの

@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]を使用すると、'#<#

+0

返信ありがとう、その素晴らしい答え。少しだけあなたの助けが必要です:) –

+0

問題はありません。フォームの表示に関連するアクションの中で '@goal'と '@task'を定義したいとします。この場合は、Showアクションの中でユーザコントローラに定義します。 "url:{controller: 'task'、action: 'create'}"の部分と同じように、フォームが送信するパスを定義することもできます。 goal_idを渡す場合は、フォーム内のhidden_​​fieldとして事前に設定した値で追加できます。たとえば、<%= f.hidden_​​field:goal、value: '何でも'%> – bkunzi01

関連する問題