私は教師に一度に複数の生徒を作成するフォームを提供しようとしています。ほとんどの人がネストされた属性でこのコンセプトに取り組んでいるようですが、単一のモデルだけを使用しているときに、そのコンセプトがどのように機能するかを理解するのは難しいです。 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つのハッシュがあるはずです。
ありがとうございました。
これは機能しました。ありがとうございました。あなたが気にしないなら、私は二重のアンダースコア構文に慣れていません。のように、 "students__first_name"。これが何であるか知っていますか?もっと読むことができますか? –
これは単に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
優れています。再度、感謝します。 –