2016-08-18 3 views
1

私は教師に一度に複数の生徒を作成するフォームを提供しようとしています。ほとんどの人がネストされた属性でこのコンセプトに取り組んでいるようですが、単一のモデルだけを使用しているときに、そのコンセプトがどのように機能するかを理解するのは難しいです。 This articleでは、ネストされた属性を使用せずにこれを実現することができましたが、私の結果は著者の示唆したように機能しません。受講者配列には、フォームの各セクションごとに1つのハッシュを含める必要があります。しかし、フォームを送信してパラメータをチェックすると、配列には1つのハッシュだけが存在します。Railsマルチレコードフォームは最後のレコードのパラメータしか保存しません

students_controller.rb

def multi 
    @student_group = [] 
    5.times do 
     @student_group << Student.new 
    end 
    end 

(私はそれが別のビューですので、私は「マルチ」と呼ばきたアクションを使用しています:彼女のアプローチを調整

は、私はこのコントローラを持っています一度に1人の生徒しか作成しない通常の「作成」アクションよりも、私はすべてを通常の作成アクションに移そうとしましたが、同じ結果が得られます)。

ビュー:

multi.html.erb

<%= form_tag students_path do %> 
    <% @student_group.each do |student| %> 
    <%= fields_for 'students[]', student do |s| %> 

     <div class="field"> 
     <%= s.label :first_name %><br> 
     <%= s.text_field :first_name %> 
     </div> 
     <div class="field"> 
     <%= s.label :last_name %><br> 
     <%= s.text_field :last_name %> 
     </div> 

    <% end %> 
    <% end %> 
    <div class="actions"> 
    <%= submit_tag %> 
    </div> 
<% end %> 

結果:

(byebug) params 

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"3Xpi4XeqXuPs9jQvevy+nvGB1HiProddZzWq6Ed7Oljr3TR2fhx9Js6fN/F9xYcpgfDckCBOC2CoN+MrlFU0Bg==", "students"=>{"first_name"=>"fff", "last_name"=>"ggg"}, "commit"=>"Save changes", "controller"=>"students", "action"=>"create"} permitted: false> 

は1つだけ "FFF GGG" という名前の学生のために含まれています。異なる生徒と4つのハッシュがあるはずです。

ありがとうございました。

答えて

2

fields_forは、form_forと組み合わせてのみ使用されます。 forは、使用する予定のモデルを指しています。モデルのないフォームを作成しようとしているので、独自の入力フィールド名を作成する必要があります。

代わりにfields_forを使用しないでください。代わりに、フォームタグヘルパーを使用して各入力をレンダリングします。

<%= label_tag "students__first_name", "First Name" %> 
<%= text_field_tag "students[][first_name]" %> 

...など。

キーは、生徒のパラメータがハッシュの配列になることを示すためにフィールド名には[]という文字列が含まれていることが重要です。あなたはほぼfields_forstudents[]と呼ぶことによってそれを得ましたが、正しく動作するにはモデルが必要であるため、fields_forは無視されました。

+0

これは機能しました。ありがとうございました。あなたが気にしないなら、私は二重のアンダースコア構文に慣れていません。のように、 "students__first_name"。これが何であるか知っていますか?もっと読むことができますか? –

+0

これは単にRailsがテキストフィールドの入力名をstudents [] [first_name] "'に変換する方法です。 [sanitize_to_id](https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/form_tag_helper.rb#L898)メソッドを使用してください。ラベルは、どの入力IDであるかを指定する 'for'属性を持つべきです(ラベルをクリックすると、カーソルのフォーカスが入力に置かれるようになります)。したがって、 'label_tag'の最初の引数は' text_field_tag'への最初の引数の墨塗りされたidバージョンです。通常のフォームタグヘルパーがそれをしないので、これを行う必要があります。 – DiegoSalazar

+0

優れています。再度、感謝します。 –

関連する問題