カテゴリ: Rails 更新日: 2025/12/02

Railsで非同期リクエストを使いこなそう!初心者でもわかるTurbo・fetch APIとコントローラ設計の基本

非同期リクエスト対応:Turbo/ fetch API とコントローラ設計の要点
非同期リクエスト対応:Turbo/ fetch API とコントローラ設計の要点

先生と生徒の会話形式で理解しよう

生徒

「Railsで、ボタンを押したときだけ部分的にページを更新する方法ってありますか?全部の画面を再読み込みしたくないです。」

先生

「その場合は非同期リクエストが便利ですよ。Turboやfetch APIを使えば、ページ全体をリロードせずに動きのあるアプリが作れます。」

生徒

「非同期って難しそうですね……」

先生

「大丈夫です!Railsでは仕組みが整っているので、初心者でも扱いやすいんですよ。順番に解説していきましょう!」

1. 非同期リクエストとは?

1. 非同期リクエストとは?
1. 非同期リクエストとは?

非同期リクエストとは、ページ全体を更新するのではなく、一部分だけをサーバーと通信して書き換える技術のことです。英語ではAJAX(エージャックス)とも呼ばれます。

例えば、「いいねボタンを押したときに、その部分だけカウントが増える」といった動作が可能になります。これにより、ユーザー体験(UX)が大きく向上します。

2. Rails 7からのTurboとは?

2. Rails 7からのTurboとは?
2. Rails 7からのTurboとは?

Turboは、Rails 7で導入された標準の非同期通信ツールです。JavaScriptを書かなくても、HTMLだけで非同期リクエストを実現できるのが特徴です。

たとえば、以下のようにフォームにdata-turbo-frameを指定するだけで、自動で部分的な更新が可能になります。


<turbo-frame id="comment_form">
  <%= form_with model: @comment do |f| %>
    <%= f.text_area :content %>
    <%= f.submit "投稿" %>
  <% end %>
</turbo-frame>

これだけで、フォームを送信してもページ全体をリロードせずに、新しいコメントだけが反映されます。

3. Turboを使うときのコントローラ設計

3. Turboを使うときのコントローラ設計
3. Turboを使うときのコントローラ設計

Turboを使った場合、通常のHTMLとTurbo用のレスポンスを切り分けることがポイントです。


def create
  @comment = Comment.new(comment_params)
  if @comment.save
    respond_to do |format|
      format.turbo_stream
      format.html { redirect_to post_path(@comment.post) }
    end
  else
    render :new
  end
end

format.turbo_streamとすることで、Railsは自動でcreate.turbo_stream.erbというテンプレートを探して表示してくれます。

4. fetch APIとは?JavaScriptで非同期通信する方法

4. fetch APIとは?JavaScriptで非同期通信する方法
4. fetch APIとは?JavaScriptで非同期通信する方法

fetch APIは、ブラウザに標準搭載されているJavaScriptの機能で、手動で非同期リクエストを送ることができます。

Turboではできない複雑な動作をしたいときや、APIと連携する場面で活躍します。


<button id="like-btn">いいね!</button>

<script>
document.getElementById("like-btn").addEventListener("click", () => {
  fetch("/likes", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-CSRF-Token": document.querySelector("meta[name='csrf-token']").content
    },
    body: JSON.stringify({ post_id: 1 })
  })
  .then(response => response.json())
  .then(data => {
    alert(`現在のいいね数: ${data.count}`);
  });
});
</script>

5. fetch API用のRailsコントローラ設計

5. fetch API用のRailsコントローラ設計
5. fetch API用のRailsコントローラ設計

fetch APIで通信する場合、Rails側のコントローラではrender json:を使ってJSON形式で返すようにします。


def create
  like = Like.create(post_id: params[:post_id])
  render json: { count: Like.where(post_id: params[:post_id]).count }
end

これで、JavaScript側にデータが返され、動的に画面に反映させることができます。

6. Turboとfetch APIの使い分けポイント

6. Turboとfetch APIの使い分けポイント
6. Turboとfetch APIの使い分けポイント
  • Turbo:フォームや部分更新がシンプルなとき。JavaScript不要。
  • fetch API:細かい動作やアニメーション、API連携が必要なとき。

どちらも非同期通信を実現する手段ですが、用途に応じて適切に選ぶことが大切です。

7. 非同期対応でRailsアプリはもっと快適に

7. 非同期対応でRailsアプリはもっと快適に
7. 非同期対応でRailsアプリはもっと快適に

非同期通信を取り入れることで、Railsアプリケーションはページの切り替えが少なくなり、動きのある快適な操作感を提供できます。

Turboやfetch APIを理解して使いこなすことで、今までよりもぐっと使いやすいアプリを作れるようになります。コントローラ設計も、レスポンス形式を意識するだけなので初心者にも優しい仕組みです。

これをきっかけに、あなたのRailsアプリにもインタラクティブな非同期機能を取り入れてみましょう!

関連記事:
カテゴリの一覧へ
新着記事
New1
データベース
SQLの処理が遅くなる原因とは?初心者向けにデータベースパフォーマンス最適化を完全解説
New2
Ruby
RubyのネストHash操作を徹底解説!digとtransformメソッドで複雑なデータも楽々
New3
Rails
Railsインデックス設計の極意!爆速サイトを作るためのスキーマ設計ガイド
New4
データベース
SQLのCOMMITとROLLBACKとは?トランザクション操作を初心者向けに完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
PATHと環境変数の正しい設定!Windows・Mac・Linux別チェックリスト付き
No.2
Java&Spring記事人気No2
Rails
Railsで日本語と時刻の設定をしよう!初心者でも安心のlocale/zone初期設定チートシート
No.3
Java&Spring記事人気No3
Ruby
Rubyのハッシュを徹底比較!シンボルキーと文字列キーの違いと使い分け
No.4
Java&Spring記事人気No4
Rails
Railsマイグレーションの型選びを完全ガイド!初心者が迷わないカラム設計
No.5
Java&Spring記事人気No5
Ruby
WindowsでRubyをインストールする方法!RubyInstallerとMSYS2を使った完全ガイド
No.6
Java&Spring記事人気No6
Rails
RailsモデルとActive Record基礎|ID戦略を完全理解!AUTO INCREMENT・UUID・ULIDの比較と導入手順
No.7
Java&Spring記事人気No7
データベース
ACID特性とは?データベーストランザクションの信頼性を初心者向けに徹底解説
No.8
Java&Spring記事人気No8
Rails
RailsモデルとActive Record基礎|クエリログの読み方を理解してEXPLAIN・joins・includesの違いを学ぼう