カテゴリ: Rails 更新日: 2025/11/26

Railsでrescue_fromを使った例外処理の基本!初心者向けJSONレスポンスの書き方

rescue_fromで例外ハンドリング:404/422/500のJSONレスポンス設計
rescue_fromで例外ハンドリング:404/422/500のJSONレスポンス設計

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

生徒

「Railsでエラーが起きたときに、うまく処理する方法ってあるんですか?」

先生

「もちろんありますよ。rescue_fromという機能を使えば、予期しないエラーにも対応できます。」

生徒

「それって、具体的にどんなときに使うんですか?」

先生

「例えば、存在しないデータにアクセスしたときの404エラーや、無効なデータの422エラー、予期しないバグによる500エラーなどに対応できます。初心者でもできるように、わかりやすく説明しますね!」

1. Railsの例外処理とは?

1. Railsの例外処理とは?
1. Railsの例外処理とは?

Ruby on Rails(レイルズ)は、Webアプリケーション開発に使われる人気のフレームワークです。実際の開発では、エラー(例外)が発生することがあります。たとえば、存在しない記事を見ようとしたときや、データの保存に失敗したときなどです。例外処理(れいがいしょり)とは、こういったトラブルが発生したときに、アプリが止まらずに対応するしくみです。

Railsでは、rescue_from(レスキュー・フロム)という方法を使って、例外をキャッチし、エラーに対して適切なレスポンス(返答)を返すことができます。

2. rescue_fromの基本的な使い方

2. rescue_fromの基本的な使い方
2. rescue_fromの基本的な使い方

rescue_fromは、Railsのコントローラの中で使うメソッドです。特定の種類のエラーが起きたときに、別のメソッドを呼び出すことができます。これにより、エラー内容に応じて、ユーザーにわかりやすいエラーメッセージを返したり、ログを記録したりできます。

以下は、存在しないデータにアクセスしたときの「404エラー」をJSON形式で返す例です。


class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session

  rescue_from ActiveRecord::RecordNotFound, with: :render_404

  private

  def render_404(exception)
    render json: { error: 'データが見つかりませんでした。' }, status: :not_found
  end
end

3. よく使うステータスコード:404・422・500

3. よく使うステータスコード:404・422・500
3. よく使うステータスコード:404・422・500

例外に応じて、次のようなHTTPステータスコードを使い分けることが一般的です。

  • 404 Not Found:指定したデータが見つからないとき。
  • 422 Unprocessable Entity:バリデーションエラーなど、データが不正なとき。
  • 500 Internal Server Error:予期しないバグやサーバー側のエラー。

それぞれの例に対応したrescue_fromの書き方を見てみましょう。

4. 422エラーとバリデーションの例

4. 422エラーとバリデーションの例
4. 422エラーとバリデーションの例

ユーザーが送ってきたデータに問題があるとき、422エラーとして返すことができます。


class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordInvalid, with: :render_422

  private

  def render_422(exception)
    render json: { error: '入力内容が正しくありません。', details: exception.record.errors.full_messages }, status: :unprocessable_entity
  end
end

5. 500エラーのハンドリング例

5. 500エラーのハンドリング例
5. 500エラーのハンドリング例

コードのバグなどで、予想外のエラーが発生することがあります。このときは、500エラーとして処理します。ただし、開発中はそのままエラーを表示したほうが原因を特定しやすいため、本番環境だけに設定するのが一般的です。


class ApplicationController < ActionController::Base
  rescue_from StandardError, with: :render_500

  private

  def render_500(exception)
    logger.error exception.message
    logger.error exception.backtrace.join("\n")
    render json: { error: 'サーバー内部でエラーが発生しました。' }, status: :internal_server_error
  end
end

6. JSONレスポンスとは?

6. JSONレスポンスとは?
6. JSONレスポンスとは?

JSON(ジェイソン)とは、Webでよく使われるデータ形式の一つで、「{"name":"山田"}」のように鍵と値をセットで表します。スマートフォンアプリやJavaScriptとRailsを連携する際によく使われ、機械でも人間でも読みやすいのが特徴です。

今回のように、エラーの情報もJSONで返すことで、ユーザーにとっても開発者にとってもわかりやすくなります。

7. rescue_fromを複数使うときの注意点

7. rescue_fromを複数使うときの注意点
7. rescue_fromを複数使うときの注意点

rescue_fromは、どのエラーに対して、どのメソッドで処理するかを明示的に書く必要があります。同じ種類のエラーを複数回指定すると、後に書かれたものが優先されます。

また、StandardErrorはすべての例外の親にあたるため、先に記述すると他のエラーがキャッチされないことがあります。順番にも注意しましょう。

8. よくあるエラーとデバッグ方法

8. よくあるエラーとデバッグ方法
8. よくあるエラーとデバッグ方法

rescue_fromを設定したのに、うまく動かないことがあります。例えば:

  • 対象のエラークラスが違っている(例:RecordNotFoundと書くべきところをNotFoundにしている)
  • privateメソッドが呼び出せない場合
  • JSON形式が意図通りに出力されない

そんなときは、loggerを使ってエラーの中身をログに出すと、原因が分かりやすくなります。


def render_500(exception)
  logger.error exception.message
  logger.error exception.backtrace.join("\n")
  render json: { error: 'サーバーエラーが発生しました。' }, status: :internal_server_error
end
関連記事:
カテゴリの一覧へ
新着記事
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の違いを学ぼう