2011-01-09 15 views
16

これはおそらく基本的な質問です。一度に3つのレコードを作成できるフォームを作成しようとしています。私は、ユーザーが送信ボタンを一度クリックするだけでよいようにしたい。レビューモデルに名前、コメント、評価を送信しています。現在、最後のレコードのみがデータベースに入力されます。Rails 3が複数のレコードを含むフォームを提出する

<%= form_for([@user,@review]) do |f| %> 
<table> 
    <tr> 
    <td>Rank</td> 
    <td>Name</td> 
    <td>Comment</td> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "5" %> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "3" %> 
    </tr> 
    <tr> 
    <td>3</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "1" %> 
    </tr> 
</table> 
    <div class="actions"> 
    <%= f.submit "Create my top 3" %> 
    </div> 
<% end %> 

アドバイスをいただければ幸いです。ありがとう。

答えて

26

私は、このためにfields_forを使用することをお勧めします:

<%= form_for([@user, :reviews]) do |f| %> 
    <% @reviews.each do |review| %> 
    <%= fields_for review do |r| %> 
     <%= render "reviews/form", :r => r %> 
    <% end %> 
    <% end %> 
<% end %> 

、この作業を行うには、コントローラで必要な数のレビューオブジェクトを作成する必要があります。

def new 
    # you could also have this in a before_filter... 
    @user = User.find(params[:id]) 
    @reviews = Array.new(3) { @user.reviews.build } 
end 

このユーザーの新しいレコードのレビューレコードが作成されます。これは新しいレコードとは異なります。インスタンスは単にRubyオブジェクトです。今度は@user.reviews.buildを3回呼び出したので、あなたのビューに3つのレビューが表示されます。

def create 
    @user = User.find(params[:id]) 

    @reviews = Review.create(params[:reviews]) 
    # Some more logic for validating the parameters passed in 
end 

この3つの新しいReviewオブジェクトを作成し、3つのすべてが有効であると仮定すると、@userにリンクします。

+1

私はあなたのポストによって幾分混乱しています。私が投稿した現在のページはレビュー#新しいページなので、あなたは "the_action"と呼んでいるレビューコントローラーの新しいdefです。同様に、レビューコントローラーのdef作成のwhatever_this_isですか? また、レンダリングフォームに 'render/form'を入れる場所はありますか?現在、:url => reviews_path)が私に名前の誤りを与えています。ありがとう。 – John

+3

必要なレコードの数がわからない場合。例。ユーザーは追加エントリのためにフォームに新しい行を追加することができます。 – turbo2oh

+2

ここで新しい行を追加します:http://stackoverflow.com/questions/16919711/multiple-non-nested-model-creation-on-same-page/16920211#comment24427696_16920211 – MrYoshiji

6

railsに配列を伝える必要があります。まず、read this section of this article

あなたの目的のために、あなたは手でフォームを構築する必要があります:

<%= form_tag 'foo' do %> 
    <% [1,3,5].each do |i| %> 
    <%= text_field_tag 'review[][name]' %> 
    <%= text_field_tag 'review[][comment]' %> 
    <%= hidden_field_tag 'review[][rating]', :value => i %> 
    <% end %> 
<% end %> 
+0

OPはfields_forに 'accepts_nested_attributes_for'を使用する必要があります。 –

+1

うーん...本当に問題なの?これは同じことを成し遂げます、そして、これはRailsのガイドがそれをする方法です。それが正しく機能するときにdownvoteを本当に価値がある? – sethvargo

+0

あなたがリンクした記事やその他の記事を読んだことがありますが、私はまだこの問題を解決するのに問題があります。フォームが正しくレンダリングされていますが、 'foo'部分が問題を起こしています。 fooをuser_review_pathに置き換えましたが、ルーティングエラーが発生していますか?私は新しいコントローラやルーティングファイルを作成する必要がありますか? – John

関連する問題