はじめに
Webアプリケーションにおいて、ユーザーがデータを送信するためのフォームは欠かせない要素である。Ruby on Railsでは、form_with
ヘルパーを用いて、ネストされたリソースのフォームを簡単に扱うことができる。Railsでネストされたフォームを作成する際の基本的な概念と、form_with
の使い方について整理する。
ネストされたリソースとは: ネストされたリソースとは、あるリソースが別のリソースに依存する際の関係を指。例えば、ユーザーがブログの投稿を行い、その投稿に対して複数のコメントができるような場合、コメントは投稿にネストされたリソースとなる。
form_with
ヘルパーの導入: Rails 5.1以降で導入された form_with
ヘルパーは、form_for
と form_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
というパスにデータを送信する。@tweet
の id
がURLのパラメータとして使用され、新規 @comment
がそのツイートに関連付けられる。
ルーティングとの連携: フォームの送信先URLは、Railsのルーティング設定に大きく依存する。ネストされたリソースのルーティングは、以下のように設定されている必要がある。
resources :tweets do
resources :comments, only: [:create]
end
このルーティングにより、CommentsController
の create
アクションが /tweets/:tweet_id/comments
にマップされる。
まとめ: form_with
ヘルパーを用いることで、Rails開発者はネストされたリソースのフォームを簡単に実装することができる。この機能は、親子関係にあるリソース間でのデータの送信をシンプルかつ効率的に行うための強力なツールである。ネストされたフォームの概念は最初は複雑に感じるかもしれませんが、ルーティングとモデルの関係を理解することで、Railsの「Convention over Configuration」の原則を生かして開発を加速させることができる。