第20回  Railsのネストされたフォーム: form_with の活用

はじめに

Webアプリケーションにおいて、ユーザーがデータを送信するためのフォームは欠かせない要素である。Ruby on Railsでは、form_with ヘルパーを用いて、ネストされたリソースのフォームを簡単に扱うことができる。Railsでネストされたフォームを作成する際の基本的な概念と、form_with の使い方について整理する。

ネストされたリソースとは: ネストされたリソースとは、あるリソースが別のリソースに依存する際の関係を指。例えば、ユーザーがブログの投稿を行い、その投稿に対して複数のコメントができるような場合、コメントは投稿にネストされたリソースとなる。

form_with ヘルパーの導入: Rails 5.1以降で導入された form_with ヘルパーは、form_forform_tag の柔軟性を組み合わせたものです。model オプションを用いて、単一または複数のオブジェクトを渡すことができる。

ネストされたフォームの作成: ネストされたリソースのフォームを作成する場合、model オプションに親子関係にあるモデルのインスタンスの配列を渡す。例えば、@tweet@comment があり、@comment が新規オブジェクトである場合、以下のように記述する。


<%= form_with(model: [@tweet, @comment], local: true) do |form| %>
  <%= form.text_area :text, placeholder: "コメントする", rows: "2" %>
  <%= form.submit "SEND" %>
<% end %>

このフォームは、/tweets/:tweet_id/comments というパスにデータを送信する。@tweetid がURLのパラメータとして使用され、新規 @comment がそのツイートに関連付けられる。

ルーティングとの連携: フォームの送信先URLは、Railsのルーティング設定に大きく依存する。ネストされたリソースのルーティングは、以下のように設定されている必要がある。


resources :tweets do
  resources :comments, only: [:create]
end

このルーティングにより、CommentsControllercreate アクションが /tweets/:tweet_id/comments にマップされる。

まとめ: form_with ヘルパーを用いることで、Rails開発者はネストされたリソースのフォームを簡単に実装することができる。この機能は、親子関係にあるリソース間でのデータの送信をシンプルかつ効率的に行うための強力なツールである。ネストされたフォームの概念は最初は複雑に感じるかもしれませんが、ルーティングとモデルの関係を理解することで、Railsの「Convention over Configuration」の原則を生かして開発を加速させることができる。