2011-12-07 14 views
2

私は今これが1000回尋ねられましたが、それは私を助けないheh :)私はこの1時間に行ってきました。マイ形式:Railsルーティングエラーネストされたform_for

= form_for @comment, :url_for => { :action => "create", :controller => "comments"}, :method => :post 

私のすくい路線:

    POST /t/:trunk_id/r/:root_id/comments(.:format)   {:action=>"create", :controller=>"comments"} 
trunk_root_comment GET /t/:trunk_id/r/:root_id/comments/:id(.:format)  {:action=>"show", :controller=>"comments"} 

エラー:

undefined method `comments_path' for #<#<Class:0x007fed2c713128>:0x007fed2c71cc78> 

私は、フォームのスペースに名前を付ける場合に:

作るべき
= form_for [:trunk_root, @comment], :url_for => { :action => "create", :controller => "comments"}, :method => :post do |f| 

ルートtrunk_root_comments_path ..は正しいですか?すくいルートにオルディング..私は得る:

No route matches {:controller=>"comments", :format=>nil} 

ヘルプは非常に高く評価された。..時間これを見て..

UPDATE:

は、このような偉大な答えをあなたにライアンをありがとう!私は何かを非常に明確に説明しています。私はちょうど「物事を投げかけている」というものでしたが、少なくとも私はよく理解しています。私は実際に私のレーキルートで 'trunk_root_comments_path'を利用していましたが、あなたが言及した組み合わせのいくつかを試してみましたが、私が欠けていたものを本当に貪欲にしていませんでした。私はMongoを使っていますが、Trunkモデルを実際には持っていません。私はトランク・コントローラを持っていてルートの一部(おそらく悪いアイデア)を持っていますが、 。

は、だから私はあなたのTLDRを試してみましたが、それがエラーを言った:?

Undefined method 'root_comments_path' 

...何のトランクモデルが存在しない原因となり、私が想定し..ので、私はちょうど

= form_for [@trunk, @root, @comment] do |f| 
で正しいIDと等しく@trunk作ら

< - と私は..私は私が失敗してるので、私は同様にあなたの最も明確なバージョンを試してみなければなりません。..おそらく理にかなっている。..うまく考え出し「「未定義のメソッド `politics_root_comments_path」を得た:

= form_for @comment, :url => (trunk_root_comments_path(:trunk_id => @root.trunk, :root_id => @root.id)) do |f| 

と確かに十分です...だから私はそれをもっと短くする方法はあまりよく分かりません。私にとって奇妙なことは、ルートの深さと同じレベルの別のネストされたリソース「写真」があることです私はそれを= form_for [:trunk_root、@photo]、:html => {:class => 'root_form'}とすることができました| f | ..しかし、何らかの理由で私はできませんでした..とにかく私は100%理解するのに十分なことを私にくれたと言いますが、私は20%の理解から50%の理解に向かうと思っています。私はIDが経路にとって重要であることを知っています。私は、url_helperの仕組みを紹介していますが、実際にはそれを完全に踏襲するために、もっと詳しく読む必要があります。私は今でも、このような難しい状況を乗り切るために、長い道のりで適切なルートを構築することができます。だから、あなたに感謝:)あなたはこのルートが設定したがしようとしている場合

+0

私の答えを無視してください(少なくともしばらくは):あなたのルートはどのように設定されていますか? – jlundqvist

答えて

10

TLを、DRは、あなたがあなたのURLの両方の:trunk_idroot_idを指定するか、またはこのようなform_forを使用する必要があります。

<%= form_for [@trunk, @root, @comment] do |f| %> 

Railsは与えているハッシュからURLを作成しようとしていますが、そのハッシュはルーティングテーブルの何も一致しません。

{ :controller => "comments", :action => "create", :trunk_id => trunk.id, :root_id => root.id } 

をしかし、それは本当に少しTLだ; DR:あなたはこれを行うことができます。

それを行うにはクーラーの方法はこれです:それぞれtrunkrootTrunkRootインスタンスである

trunk_root_comments_path(trunk, root) 

<%= form_for [trunk, root, comment] do |f| %> 

科学:今

、あなたは超邪悪クールになりたい場合は、このようにそれを行います!

これはどのように機能しますか?小学校、私の愛する:

Railsはまず、我々は配列を使用してform_forを使用していることを認識し、そのは、当社が事業を意味します。 Railsは渡されたこの配列を使用し、そこからURLを構築します。これは、ルートによって定義されているルーティングヘルパーを使用して行います。残念なことに、これでうまく行かない面白い方法でルートを定義しましたが、は恐れません。これを修正することができます。

match '/t/:trunk_id/r/:root_id/comments', :via => :post 

post '/t/:trunk_id/r/:root_id/comments', :as => "trunk_root_comments" 

あなたはが、代わりはすでにこれを持っていることがあります。代わりにこれを入れ

post '/t/:trunk_id/r/:root_id/comments' 

を:

あなたがそれを行うことができる方法は、あなたがconfig/routes.rbでこれを持っているところ、これをあります

これは次のようになります:

match '/t/:trunk_id/r/:root_id/comments', :via => :post, :as => "trunk_root_comments" 

いずれかの方法で、あなたが今の経路によって定義されていない1が、2(!!)パスヘルパーを持っています。これらはそれぞれtrunk_root_comments_pathtrunk_root_comments_urlです。 これらのメソッドの名前は、私があなたに説明しようとしているものにとって非常に重要です。注意を払う!

だから、戻って私たちの小さなform_forコールへ:

<%= form_for [trunk, root, comment] do |f| %> 

Railsは、それはそれを見ることができるので、我々は配列を使用していることを知っています。この配列では、と思われるかもしれませんが、実際はそうではありません。

Railsはこの配列の各要素をとり、ルーティングヘルパーメソッドの名前をまで作成します。これは実際にform_forの一部ではありませんが、別の方法は、あなたがそれ自体で使用することができますurl_forと呼ばれる:初めに

url_for([trunk, root, comment]) 

url_forによって生成され、このルーティングヘルパーメソッド名は、単に空の配列([])です。何も特別なものはありません。

しかし、何が起こるかです!

最初の要素は、Trunkクラスの持続インスタンスになります。 「持続」とは、を直接のデータベースにマップするオブジェクトであることを意味します。ああORM!

これがわかるように、ルーティングヘルパーは[:trunk]になります。

第2の要素は、Rootクラスの持続インスタンスになる予定です。 Railsもこれを知っています(Railsはスマート!)これを配列に追加して[:trunk, :root]にします。驚くばかり。

3番目の(そして最後の)要素は、Railsによってチェックされます。それは、(この場合は)非永続的な要素であることがわかります。つまり、まだデータベースに保存されていません。扱い異なり、このレール、代わりにこのにそれを回す、配列に[:comments]を追加します:私は今、これで行くよどこ

[:trunk, :root, :comments] 

を参照してください? Railsが行っている(あなたが好きならば、あるいはのthang )それがこのように一緒にこれらの三つの部分に参加することだという今

trunk_root_comments、とちょうど良い測定のために、それはそれの終わりに_pathをあげるよ、ターニングそれは最後のtrunk_root_comments_pathヘルパーに。

そして! Man、そして... Railsはこのメソッドを呼び出し、引数を渡します!ただ、このように:

/t/:trunk_id/r/:root_id/comments 

そしてBAM:

trunk_root_comments_path(:trunk_id => trunk.id, :root_id => root_id) 

これは、このようなリソースへの完全なパスを生成します!フルサークル!これは、RailsがURLを生成する方法を知っているので、もはや醜いハッシュを使用する必要はありません。

成功!

+0

非常にいい答えです。ここであなたのanwsersを読むことはとても良いことです。 – lucapette

+1

ありがとうライアン!どのような素晴らしい答え。ルーティングに関する問題を抱えている人が増えたら、これを見てほしい。それはうまくいきましたが、私が望むほどtldrではないかもしれませんが、詳細については私のアップデートを見ることができます。ありがとう:) – Inc1982

0

わからない:

= form_for @comment, :url => trunk_root_comments_path 
+0

うまくいかない場合、このフォームがレンダリングされているリクエストで渡される、または利用可能な ':trunk_id'と':root_id'の両方のパラメータが必要です。 –

+0

ああ、私はそれを完全に逃した。 – jlundqvist

+0

応答のためにjlundqvistに感謝します。 Ryan Biggの提案を使って、どのように動いているのかを反映するために、私は上記の答えを更新しました。 – Inc1982

関連する問題