フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成したい場合があると思います。
(例えばbookレコードとauthorレコードなど)
今回はRailsで一度に関連するモデルのレコードを一緒に作成する方法を紹介します。
ruby 2.4.1
rails 5.1.4
まず、モデルクラスを作成します(migrationファイルはあるものとします)
今回はbookクラスとauthorクラスを作成します。
それぞれの内容は下記のとおりです。
# 著者クラス class Author < ActiveRecord::Base has_many :books accepts_nested_attributes_for :books end
# 本クラス class Book < ActiveRecord::Base belongs_to :author end
通常のリレーションに加えて、親であるauthorクラスには「accepts_nested_attributes_for :books」の一文を追加します。
今回はauthorのみコントローラを作成します。
内容は下記のとおりです。
# 著者クラスのコントローラ 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])を追加します。
authorクラスのフォームを作成します。
内容は下記のとおりです。
<%= 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」を使って関連するモデルクラスのレコードを一緒に作成する方法を紹介しました。