カテゴリー: BackEnd

関連するモデルのレコードを一緒に作成する方法

はじめに

フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成したい場合があると思います。
(例えば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])を追加します。

Viewの作成

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」を使って関連するモデルクラスのレコードを一緒に作成する方法を紹介しました。

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: Rails

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前