はじめに
フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成したい場合があると思います。
(例えばbookレコードとauthorレコードなど)
今回はRailsで一度に関連するモデルのレコードを一緒に作成する方法を紹介します。
前提条件
ruby 2.4.1
rails 5.1.4
実装
まず、モデルクラスを作成します(migrationファイルはあるものとします)
モデルの作成
今回はbookクラスとauthorクラスを作成します。
それぞれの内容は下記のとおりです。
1 2 3 4 5 | # 著者クラス class Author < ActiveRecord::Base has_many :books accepts_nested_attributes_for :books end |
1 2 3 4 | # 本クラス class Book < ActiveRecord::Base belongs_to :author end |
通常のリレーションに加えて、親であるauthorクラスには「accepts_nested_attributes_for :books」の一文を追加します。
コントローラの作成
今回はauthorのみコントローラを作成します。
内容は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 著者クラスのコントローラ class AuthorsController < ApplicationController def new @author = Author.new @author.books.build end def create @author.new(author_params) if @author.save redirect_to @author else render :new end end private def author_params params.require(:author).permit(:name, books_attributes: [:name]) end end |
#newではauthorクラスのインスタンスを作成後に「build」でbookクラスのインスタンスを1つ作成しています。
また、Strong Parametersにbook用の項目(books_attributes: [:name])を追加します。
Viewの作成
authorクラスのフォームを作成します。
内容は下記のとおりです。
1 2 3 4 5 6 7 8 9 | <%= form_for(@author) do |f| %> <%= f.label :name %> <%= f.text_field :name %> <%= f.fields_for :books do |field| %> <%= field.label :name %> <%= field.text_field :name %> <% end %> <%= f.submit %> <% end %> |
「f.fields_for」以下でbookクラスのパラメータを入力するテキストボックスを作成しています。
さいごに
今回は「accepts_nested_attributes_for」を使って関連するモデルクラスのレコードを一緒に作成する方法を紹介しました。