
株式会社ゼネットシステム事業部 原です。
背景
Kaigi on Rails 2025 Day1 にオンライン参加いたしました。
Hotwireに関する発表が2つあり、聴講しました。
- 高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025 - Speaker Deck
- Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components - Speaker Deck
内容を理解したく、Hotwireを試してみました。
今回はこちらを参考にRailsアプリケーションにHotwireの一部であるTurboを試してみました。
猫でもわかるHotwire入門 Turbo編
http://7zenn.dev/shita1112/books/cat-hotwire-turbo
試したときの環境は以下となります
・Rails 8.0.4
・Ruby 3.4.7
検索機能の実装でransack 4.4.1を使用する際にmodelにransackable_attributesメソッドの実装を行いました。それ以外は問題なく動作しました。
Hotwireとは
HTMLをサーバーでやり取りすることにより、画面更新に必要なHTMLをサーバー側で生成して送り返すことで、大量のJavaScriptを書かずともモダンなWebアプリケーションを実現できる仕組みです。
以下3つの要素で構成されています。
- Turbo
- JavaScriptを書かずにアプリケーションを高速で描画する
- Stimulus
- 最小限のJavascriptでUIの振る舞いを追加できる
- Strada
- Webとネイティブアプリ(Android,ios)をつなぐ
今回、参考にしたサイトの中でTurboを触れました。
触れた内容と感想を述べていきます。
Turbo
TurboとはJavascriptを書かずにアプリケーションを高速で描画できる機能です。
Turbo Drive、Turbo Frames、Turbo Streamsに分かれています。
Turbo Drive
Turbo Driveを使用すると、HTMLのbody要素のみを置き換えます。head要素はそのままです。CSSやJavascriptも現在のページの状態で読み込まれるため、ページ遷移のたびに発生していたCSS、Javascriptの初期化がなくなるため、読み込みは速くなります。
Turbo Driveを無効・有効にした時と画面遷移を比較しました。
有効にしたときの画面遷移の実行時間が速くなっています。
Turbo Drive無効時
遷移のたびにcats、dogsの一覧表示に必要なcss,jsファイルなどが読み込まれていることが分かります


Turbo Drive有効時
一覧表示に必要なcss,jsを保持したまま、画面遷移が行われます。


Turbo Frames
Turbo Framesとは画面の一部分を高速に描画できるようにする機能です。
実際に一覧部分、ページネーションやソート、検索機能に対してTurbo Framesを適用しました。
適用したい画面要素に対して、<turbo_frame_tag "{任意の名前}">で囲むことでHTMLの<turbo-frame>要素とid属性を付与されます。一覧部分に対してidを付与し、検索対象に指定することでturbo-frameの実現が可能となります。

また編集機能においてもTurbo Framesを実装しました。
データを表示している_cat.html.erbに対して、turbo_frame_tagを適用すると以下のようになります。

編集ボタンを押下すると編集画面を描画する_edit.html.erb、入力フォームを描画する_form.html.erbの順で置換されます

更新ボタンを押下すると_cat.html..erbに置き換わります。
他のデータ表示部分、一覧部分に大きな影響を与えることなく更新ができました。
Turbo Streams
「データの登録完了、更新完了、削除完了と同時に画面上部にメッセージを出力するようにする」を実現するためにTurbo Streamsを利用しました。
Turbo Framesはturbo-frameタグで囲った部分のみをHTMLで置き換えできるのに対して、Turbo Streamsは複数箇所をHTMLで置き換えできます。
①{アクション名}.turbo_stream.erbを用意
②turbo_stream.prependメソッドで登録された_cat.html.erbを追加
③turbo_stream.updateメソッドで_form.html.erbの入力内容をリセット
④turbo_stream.updateメソッドでflash.html.erbの内容を表示
これにより実現しました。
登録を例に置き換えの様子を記載します。
名前と年齢を入力

登録ボタンを押下すると

flashタグの内容が変化していること、catのturbo-frameタグが増えていることが分かります。
また、ログを確認するとデータ形式はTURBO_STREAMでやり取りしていることが分かります。Turbo streamから各HTMLに対して操作ができると理解しました。
Started POST "/cats" for ::1 at 2025-10-31 15:03:27 +0900
Processing by CatsController#create as TURBO_STREAM
Parameters: {"authenticity_token" => "[FILTERED]", "cat" => {"name" => "cat1", "age" => "1"}, "commit" => "登録する"}
TRANSACTION (0.9ms) BEGIN
↳ app/controllers/cats_controller.rb:35:in 'CatsController#create'
Cat Create (6.9ms) INSERT INTO "cats" ("name", "age", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["name", "cat1"], ["age", 1], ["created_at", "2025-10-31 06:03:27.265139"], ["updated_at", "2025-10-31 06:03:27.265139"]]
↳ app/controllers/cats_controller.rb:35:in 'CatsController#create'
TRANSACTION (2.0ms) COMMIT
↳ app/controllers/cats_controller.rb:35:in 'CatsController#create'
Rendering cats/create.turbo_stream.erb
Rendered cats/_cat.html.erb (Duration: 2.3ms | GC: 0.0ms)
Rendered application/_flash.html.erb (Duration: 0.2ms | GC: 0.0ms)
Rendered cats/create.turbo_stream.erb (Duration: 5.4ms | GC: 0.0ms)
Completed 200 OK in 35ms (Views: 7.4ms | ActiveRecord: 9.6ms (1 query, 0 cached) | GC: 0.0ms)
Turbo Streamsにより、
メッセージを出力する部分のFlashとデータを表示する部分のturbo-frameタグそれぞれを同時に変更することができました。
まとめ
Hotwireに関して以下の内容で理解することができました。
・Turboにより、Javascriptを書かずにHTMLのみで動的なWebアプリを実現できる
・Turbo Driveにより、画面全体の高速描画が可能である
・Turbo Framesにより、画面一部の要素を置き換えての描画が可能である
・Turbo Streamsにより、画面複数の要素を置き換えての描画が可能である
課題
Hotwire Turboを試してみて思ったこと・時間を作って行いたいことは以下になります。
・参考にしたサイトの中でStimulusも紹介されていたため、取り組んで理解を深めたい
・gem turbo-rails のgithubを確認し、どのような実装になっているか確認したい
・Kaigi on Railsの講義内容の理解を深めたい
・業務の中でどの描画部分が置き換え可能なのか検討したい
所見
Turboを使ってHTMLのみの置き換えを行うことにより、画面描画が速くなるため、アプリ全体のパフォーマンス向上も期待できそうです。
ここまでご覧いただきありがとうございました。
