LoginSignup
21
23

More than 3 years have passed since last update.

Rails フォーム(form_for,nested_form,fields_for) による複数同時投稿(親子、親子孫、他人)

Last updated at Posted at 2018-09-28

index

1.親子同時投稿

2.他人同時投稿

3.親子孫同時投稿

railsの投稿において大事なことは2つあると思います。どのようにしてパラメータを送るかと、それをどういうストロングパラメータによってコントローラーで受け取るかです。そのためここではformの書き方、ストロングパラメータの書き方だけを紹介します。自分でjsを書くなどといったことは一切やらず、出来るだけシンプルにやっています。モデルや、コントローラーなどは単体で投稿する時とほとんど変わらないです。

1.親子同時投稿

ここではgem 'nested_form'を使う。cocoonでも同じことが出来ます。

<%= nested_form_for @post do |f| %>

    <%= f.label :title %>
    <%= f.text_field :title %>

    <%= f.fields_for :post_images do |t| %>
        <%= t.label :image %>
        <%= t.attachment_field :image %>
        <%= t.link_to_remove 'delete' %>
    <% end %>
  <%= f.link_to_add 'add', :post_images %>
  <%= f.submit %>
<% end %>

ストロングパラメータ

private
    def post_params
        params.require(:post).permit(:title,post_images_attributes: [:id, :image, :comment, :_destroy])
    end

2.他人同時投稿

これはpostが送られなさそうだが、パラメータをみて見るとちゃんと送られています。

<%= form_for(@book) do |f| %>
    <div>book_title</div>
    <div><%= f.text_field :title %></div>
    <div>book_body</div>
    <div><%= f.text_field :body %></div>

    <%= fields_for(@post) do |t| %>
        <div>post_title</div>
        <%= t.text_field :title %>
    <% end %>
    <%= f.submit "toukou" %>
<% end %>
 Parameters: {"utf8"=>"✓", "authenticity_token"=>"#####", "book"=>{"title"=>"ddd", "body"=>"dd"}, "post"=>{"title"=>"ddd"}, "commit"=>"toukou"}

ストロングパラメータは二つのモデルに対して、別々に書けばいいだけです。

3.親子孫同時投稿

これがもっとも難しかったです。1.と同じくnested_formというgemを使って作ります。group
が親、memberが子、petが孫です。
new.html.erb、_member_fields.html.erb、_pet_fields.html.erbという3つのviewページが必要です。全て同じディレクトリにおきます。

new.html.erb
<%= nested_form_for(@group) do |f| %>
    <%= f.label :group_name %>
    <div class="group_name"><%= f.text_field :group_name, class: "field" %></div>
    <div class="members_field">
        <div class="member_name"><%= f.fields_for :members %></div>
        <div class="member_name"><%= f.link_to_add 'member_add', :members %></div>
    </div>
    <%= f.submit %>
<% end %>
_member_fields.html.erb
<div class=""><%= f.label :member_name %></div>
<div class=""><%= f.text_field :member_name,class: "field" %></div>
<div class="pet_name"><%= f.fields_for :pets %></div>
<div class="pet_name"><%= f.link_to_add 'pet_add', :pets %></div>
_pet_fields.html.erb
<div class=""><%= f.label :pet_name %></div>
<div class=""><%= f.text_field :pet_name, class: "field" %></div>

こういう感じのネストされたパラメータが送られます。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"###", "group"=>{"group_name"=>"group1", "members_attributes"=>{"0"=>{"member_name"=>"member1", "pets_attributes"=>{"0"=>{"pet_name"=>"pet1-1"},
 "1538144621725"=>{"pet_name"=>"pet1-2"}, "1538144623037"=>{"pet_name"=>"pet1-3"}}}, "1538144619585"=>{"member_name"=>"member2", "pets_attributes"=>{"1538144620711"=>{"pet_name"=>"pet2-1"}, "1538144624584"=>{"pet_name"=>"pet2-2"}}}}}, "commit"=>"Create Group"}

ストロングパラメータはこんな感じです。

params.require(:group).permit(:group_name,:members_attributes => [:id, :member_name, :_destroy, :pets_attributes => [:id, :pet_name, :_destroy]])

以上で終わりです。まだいい方法がありそうなので、あったら教えてください。

21
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
23