QA@IT

railsでnestしたルーティングを扱う際のform_forの書き方

4873 PV

現在、rails3でウェブアプリを作っているのですが、困った点があり質問させていただきました。

それはネストしたURLの場合、form_forの書き方がわからないのです。

具体的に例を挙げて説明させていただきます。
まずroutes.rbを書かせていただきます。

  resources :users do
    resources :blogs
  end

こんな感じでuserの下にblogがいます。

次に、blogの_form.html.rbを書かせていただきます。

<%= form_for @blog do |f| %>
<% end %>

これだと画面遷移したときに
undefined method `blog_path' for #<#Class:0x007f830ad8c220:0x007f830b1766d8>
のようなエラーがでます。

そこでform_forを以下のように書き換えました。

<%= form_for @blog, :url => user_blogs_path(params[:user_id]) do |f| %>

これならエラーはでませんし、createは問題なく通ります。

しかし、updateの際はSubmitを押した際に
No route matches [PUT] "/users/1/blogs"
のようにエラーがでます。

updateとcreateを別々にform_for書けばいいのかもしれませんが、あまりスマートではないと思っています。
なにかいい解決法はありませんか?

また少し質問からずれますが、このようにURLをネストした場合のscaffoldはpath関連がエラーをはきまくって、一個一個修正するのがかなり面倒です。なにか方法があれば教えていただけると嬉しいです。

回答

Userのインスタンス@userがあるとして

<%= form_for [@user, @blog] do |f| %>

のようにしたらいかがでしょうか。

編集 履歴 (0)
  • このような書き方があったのですか。スマートだし便利ですね。ありがとうございます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。