Railsの親子同時保存をマスターしよう:accepts_nested_attributes_forを使った実践的なガイド

はじめに

この記事の概要

こんちには、株式会社TOKOSの石津です!

本記事では、Railsで親子関係にあるモデルを同時に保存する方法ついて解説しています。

セマンティックタグを適切に使用することで検索エンジンがコンテンツ構造を理解しやすくなり、SEOやアクセシビリティが向上します。

Railsアプリケーションでよくある要件の1つは、親子関係にあるモデルを同時に保存することです。

この記事では、Railsのaccepts_nested_attributes_forを使用して、親子関係のモデルを同時に保存する方法を実際のコードを交えて説明します。

これにより、フォームの操作性が向上し、データの整合性を保つことができます。

対象読者

  • フォームで親子関係のデータを同時に保存したいと考えている方
  • Railsのaccepts_nested_attributes_forについて学びたい方
  • フォーム操作性の向上に興味がある方

1. 親子関係のモデルを作成する

まず、親子関係にあるモデルを作成します。

今回は、ブログ記事(Post)とコメント(Comment)を例に説明します。

class Post < ApplicationRecord
  has_many :comments
  accepts_nested_attributes_for :comments, reject_if: :all_blank, allow_destroy: true
end
class Comment < ApplicationRecord
  belongs_to :post
end

2. フォームの作成

次に、親子関係のデータを同時に入力できるフォームを作成します。

fields_forを使用して、親モデルのフォーム内に子モデルのフォームをネストさせます。

<%= form_with(model: @post) do |form| %>
  <div>
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :body %>
    <%= form.text_area :body %>
  </div>

  <%= form.fields_for :comments do |comment_form| %>
    <div>
      <%= comment_form.label :content %>
      <%= comment_form.text_field :content %>
    </div>
  <% end %>

  <div>
    <%= form.submit %>
  </div>
<% end %>

3. コントローラーの編集

最後に、親子関係のデータを同時に保存できるようにコントローラーを編集します。

newアクションで子モデルのインスタンスをビルドし、post_paramsメソッドで子モデルの属性を許可します。

class PostsController < ApplicationController
  def new
    @post = Post.new
    @post.comments.build
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to @post, notice: 'Post was successfully created.'
    else
      render :new
    end
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, comments_attributes: [:id, :content, :_destroy])
  end
end

4. まとめ

この記事では、Railsのaccepts_nested_attributes_forを使用して親子関係のモデルを同時に保存する方法を説明しました。

これにより、フォームの操作性が向上し、データの整合性を保つことができます。

実践的な例として、ブログ記事とコメントの親子関係を扱いましたが、同様の方法で他の親子関係のモデルでも実装できます。

accepts_nested_attributes_forを使うことで、親子関係のデータを一度に扱いやすくなりますが、適切なバリデーションやエラーハンドリングを行うことでさらに堅牢なアプリケーションを構築できるでしょう。

最後に、こちらの記事がRails開発に役立つことを願っています。

Railsの勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい!