RailsのTurbo Framesで部分更新を完全理解!モーダル・タブ・インライン編集の実装パターン入門
生徒
「Railsで画面の一部だけを更新する方法ってありますか?全部リロードされるのが気になります」
先生
「RailsではHotwireという仕組みを使うと、画面の一部だけを更新できます。その中心がTurbo Framesです」
生徒
「JavaScriptをたくさん書かないと難しそうです…」
先生
「大丈夫です。Turbo FramesはHTMLとRailsの仕組みをそのまま使うので、とてもシンプルですよ」
1. RailsとHotwireの基本をやさしく理解しよう
Railsは、Webアプリケーションを効率よく作るためのフレームワークです。MVCという役割分担の考え方を使い、Model(データ)、View(画面)、Controller(処理)を分けて開発します。
Hotwireは、RailsでモダンなUIを実現するための仕組みです。ページ全体を再読み込みせず、必要な部分だけを更新することで、アプリの動きを速く、使いやすくします。その中でもTurbo Framesは「画面のこの枠だけ更新したい」というときに使います。
2. Turbo Framesとは?初心者向けのたとえで解説
Turbo Framesは、Webページの中にある「更新可能な箱」のようなものです。箱に名前を付けておくと、サーバーから返ってきたHTMLで、その箱の中身だけを入れ替えることができます。
例えば、新聞の一面を全部刷り直すのではなく、天気欄だけ差し替えるイメージです。これにより、画面がチカチカせず、操作がとてもスムーズになります。
3. Turbo Framesの基本的な書き方
まずはTurbo Framesの基本構文を見てみましょう。ビュー(ERB)でturbo_frame_tagを使います。
<%= turbo_frame_tag "profile" do %>
<p>ユーザー名:太郎</p>
<% end %>
この「profile」という名前のフレームが、部分更新の対象になります。同じ名前のTurbo Frameをサーバーから返すと、その中身だけが更新されます。
4. モーダル表示をTurbo Framesで実装する考え方
モーダルとは、画面の上に重なって表示される小さなウィンドウのことです。Turbo Framesを使うと、モーダルの中身だけをRailsで生成できます。
<turbo-frame id="modal">
<!-- ここにモーダル内容が入る -->
</turbo-frame>
リンクをクリックすると、コントローラからこのmodalフレーム用のHTMLが返され、モーダル部分だけが差し替わります。JavaScriptでDOM操作を細かく書かなくても実現できるのが大きな特徴です。
5. タブ切り替えを部分更新で実現する仕組み
タブUIは、「詳細」「コメント」「履歴」など、表示内容を切り替える場面でよく使われます。Turbo Framesでは、タブの中身をフレームとして定義します。
<%= turbo_frame_tag "tab_content" do %>
<p>最初のタブ内容</p>
<% end %>
各タブのリンク先で同じtab_contentを返すことで、クリックするたびにタブ部分だけが更新されます。ページ全体はそのままなので、操作感がとても軽くなります。
6. インライン編集をTurbo Framesでシンプルに作る
インライン編集とは、表示されているテキストをその場で編集できる仕組みです。編集フォームと表示を同じ場所で切り替えるのにTurbo Framesが向いています。
<%= turbo_frame_tag "username" do %>
<p>太郎 <%= link_to "編集", edit_user_path %></p>
<% end %>
編集画面では、同じusernameフレームを使ったフォームを返します。保存後は表示用HTMLを返すだけで、自然なインライン編集が完成します。
7. Turbo Framesとコントローラの関係
Turbo Framesは特別なコントローラ処理を必要としません。通常のRailsコントローラでHTMLを返すだけです。
def show
@user = User.find(params[:id])
end
フレーム対応のビューを用意するだけで、Railsが自動的に「どの部分を更新するか」を判断します。これがHotwireの「Railsらしさ」を活かした設計です。
8. Turbo Framesを使うときの初心者向け注意点
Turbo Framesでは、フレームのID名を必ず一致させることが重要です。名前が違うと部分更新されず、通常のページ遷移になります。
また、まずは小さなUIから試すのがおすすめです。モーダル、タブ、インライン編集のような「一部分だけ変わる画面」から導入すると、仕組みを理解しやすくなります。