0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】同一モデルの異なるレコードを複数作成し、同時にcreateする方法

Last updated at Posted at 2023-02-02

どうした?

前回の記事同様、ToDoアプリを作成しています。
Todoの投稿フォームを複数個作成し、同時に投稿する方法を学んだのでそのアウトプットです。

目標物の確認

今回実装する機能は下図です。
ToDoApp_設計書 (2).png

Todo.content同士は異なるレコードです。
ボタンひとつで複数のレコードをいっぺんに作成します。

方法

コントローラ

def index
  # 略

  @category = Category.new
  2.times { @category.todos.build }
end

今回はインデックスページでnewしていること, 親モデルのCategoryと同時にcreateすることに注意してください。
ポイントとなるのは2.times { @category.todos.build }の部分です。
これにより、ビューページでTodo.content用のフォームを表示する指示を与えたときに3つのフォームが作成されます。

作成されたフォームのHTML属性を見てみよう
作成されたフォームのHTML属性を見てみます。
各フォームのname属性が以下のようになっていることに気づくでしょう。

category[todos_attributes][0][content]
category[todos_attributes][1][content]
category[todos_attributes][2][content]

Railsは各フォームのname属性に対して0~n(timesで指定した数)の値を付与します。
これによって、複数のフォームが作成されます。

空のフォームは新規作成しない

前回の記事で紹介した通り、ストロングパラメータd_blankを指定することで、空のフォームに対して_destroyするのを防ぎます。
例えば3つのフォームがあるときに

1つめ: 投稿1
2つめ: (空欄)
3つめ: 投稿3

という値を入力し送信したとき、作成されるのは

投稿1
投稿3

です。2つめのフォームの空欄はスキップされるわけですね。

参考

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?