2011-01-30 7 views
1

Topicが多いForumがあります。私のルートは次のとおりです。親リソースIDをフォームから作成アクションに渡す

GET /forums/:forum_id/topics/new => Topics#new 
POST /topics      => Topics#create 

私の問題が始まる場所です:

= form_for @topic do |topic_form| 

このフォームはPOST /topicsルートにマップされます。トピックを保存するには、forum_idを提供する必要があります。 newアクションで利用できますが、そのアクションをcreateアクションに渡す方法が見つかりません。

私はへのルートを変更してみました:今

GET /forums/:forum_id/topics/new => Topics#new 
POST /forums/:forum_id/topics  => Topics#create 

しかしforum_idトピックパラメータハッシュ外になってしまった:私はこの問題を解決するにはどうすればよい

{ topic: { title: "Test" }, commit: "Create Topic", forum_id: 1 } 

答えて

2

私は、2番目の例のように、最も適切な方法はそれをルーティングすることだと思います。そして、作成アクションでは、最初にフォーラムをインスタンス化して、それが有効であることを確認してからフォーラムからトピックを作成することができます。トピック

+0

それは '@topic = @ forum.topics.buildすべきではない:

def create @forum = Forum.find(params[:forum_id]) @topic = @forum.topics.new(params[:topic]) if @topic.save ... else ... end end 

これはあなたのフォーラムモデルにhas_manyがいることを前提としています。それはこのようなものになります(のparamsを[:トピック])'、あるいは 'build'の代わりに' create'を使い、呼び出しをスキップして保存しますか? –

+0

どちらも有効な方法ですが、私は決してこれの代わりにこれを使うべきだとは言いません。特にRubyとRailsでは、同じことを達成するための多くの異なる方法があります。私は作成する前にインスタンス化することを好む。そして、新しいものやビルドについては、私は団体で使用するときの違いを正確には分かりませんが、新しいものは私のためだけに構築されています。 – DanneManne

関連する問題