はじめに
この記事の概要
こんちには、株式会社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の勉強をしたい方はこの本が参考になるかと思いますので興味がある方は是非読んで見て下さい!