Turbo入門|Morphingで実現するスムーズなページ更新|Rails × Hotwire

Turbo Driveはページ遷移時にフルページリロードを避けることで高速なナビゲーションを実現しますが、ページの再読み込み(リフレッシュ)時にも、さらにスムーズな体験を提供することができます。

特にフォーム送信後に同じページにリダイレクトされるようなシナリオでは、ページ全体を置き換えるのではなく、変更された部分だけを更新(モーフィング)することで、ユーザー体験が大幅に向上します。

この記事では、Turbo Driveのモーフィング機能を使ったスムーズなページ更新の方法を解説します。

目次

モーフィング(Morphing)とは?

モーフィングとは、ページの再読み込み時にDOM全体を置き換えるのではなく、変更された要素だけを差分更新する仕組みです。
Turbo Driveは内部的にIdiomorphというライブラリを利用して、このモーフィングを実現しています。

モーフィングを有効にする方法

モーフィングを有効にするには、ページの<head>タグ内に以下のメタタグを追加します。

<head>
  ...
  <meta name="turbo-refresh-method" content="morph">
</head>
  • morph:変更された要素のみを差分更新(モーフィング)
  • replace(デフォルト):ページの<body>全体を置き換える

モーフィングを有効にすると、ページの状態が維持され、よりスムーズな体験が得られます。

スクロール位置の保持(Scroll preservation)

ページ更新時にスクロール位置を保持するには、以下のメタタグを追加します。

<head>
  ...
  <meta name="turbo-refresh-scroll" content="preserve">
</head>
  • preserve:スクロール位置を保持
  • reset(デフォルト):スクロール位置をページの先頭にリセット

モーフィング対象から特定の要素を除外する方法

モーフィング時に特定の要素を更新対象から除外したい場合、data-turbo-permanent属性を指定します。

例えば、ページ更新時に開いたままにしたいポップオーバーなどに有効です。

<div data-turbo-permanent>
  <!-- モーフィング対象外の要素 -->
</div>

Turbo Frameを使った部分的なモーフィング

Turbo Frameを使って、ページ内の特定の領域だけをモーフィングで更新することも可能です。
その場合、Turbo Frameにrefresh="morph"属性を指定します。

<turbo-frame id="my-frame" refresh="morph" src="/my_frame">
  <!-- フレームの内容 -->
</turbo-frame>

この仕組みを使えば、ページ初回ロード時には存在しなかった追加コンテンツ(例:ページネーション)を後から読み込み、ページ更新時にもスムーズに差分更新できます。

Turbo Streamを使ったページ更新のブロードキャスト

Turbo Streamには新たにrefreshというアクションが追加されました。
これを使うと、サーバー側からページ更新を指示できます。

<turbo-stream action="refresh"></turbo-stream>

Railsでは、turbo-rails gemを使って簡単にページ更新をブロードキャストできます。

Railsでの実装例

モデルにbroadcasts_refreshesを追加します。

# app/models/calendar.rb
class Calendar < ApplicationRecord
  broadcasts_refreshes
end

ビュー側でturbo_stream_fromを指定します。

<!-- app/views/calendars/show.html.erb -->
<%= turbo_stream_from @calendar %>

これにより、モデルが更新されると自動的にページがモーフィングでスムーズに更新されます。

まとめ

Turbo Driveのモーフィング機能を活用することで、ページの再読み込み時にも差分更新を行い、スクロール位置や画面状態を維持したままスムーズなユーザー体験を提供できます。

  • ページ更新時に差分更新(モーフィング)を有効化
  • スクロール位置を保持
  • 特定要素をモーフィング対象外に設定
  • Turbo Frameを使った部分的なモーフィング
  • Turbo Streamを使ったページ更新のブロードキャスト

Rails × Turbo Driveで、さらに快適なWebアプリケーションを作りましょう!

さらに深く学びたい方へ

この記事で紹介した技術をマスターするには、体系的な学習が重要です。独学で挫折しそうな方は、現役
エンジニアから直接学べるプログラミングスクールも検討してみてください。

現場で通用するスキルを身につけるなら

DMM WEBCAMPのカリキュラムは、実際の開発現場を想定したチーム開発も経験できます。ポートフォリオ制作
支援もあり、転職活動で差をつけられます。

未経験から4ヶ月でエンジニアとして活躍できるレベルまで成長可能です。

実務レベルのWeb開発スキルを習得するなら

RUNTEQは、1000時間の圧倒的学習量で、現場で即戦力となるWebエンジニアを育成します。Ruby on
Railsに特化し、実際のWebサービス開発を通じて実践力を養います。

卒業生の多くが自社開発企業への転職に成功している実績があります。

じっくり理解を深めたい方へ

この記事で紹介した内容を確実に身につけるには、分からない点をすぐに質問できる環境が重要です。CodeCa
mpなら、現役エンジニアとのマンツーマンレッスンで、あなたのペースで着実にスキルアップできます。

朝7時〜夜23時まで、365日受講可能なので、仕事や学業と両立しながら学習を進められます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次