MeWrite Docs

ActiveRecord::RecordNotFound

Ruby on Railsでデータベースから指定したIDのレコードが見つからない場合のエラー

概要

Ruby on RailsでActiveRecordのfind等を使用して存在しないレコードを取得しようとした場合に発生するエラーです。

エラーメッセージ

ActiveRecord::RecordNotFound: Couldn't find User with 'id'=999

原因

  1. 存在しないIDを指定: 削除済みまたは存在しないIDでfindを実行
  2. 関連レコードが存在しない: belongs_toの関連先が見つからない
  3. スコープ条件で除外されている: デフォルトスコープ等で対象外になっている

解決策

1. find_by を使用(nilを返す)

1
2
3
4
5
6
7
8
# Before(例外を発生)
user = User.find(params[:id])

# After(見つからなければnil)
user = User.find_by(id: params[:id])
if user.nil?
  # エラーハンドリング
end

2. find_by! を使用(例外を発生)

1
2
# 明示的に例外を発生させたい場合
user = User.find_by!(id: params[:id])

3. rescue で例外処理

1
2
3
4
5
def show
  @user = User.find(params[:id])
rescue ActiveRecord::RecordNotFound
  redirect_to users_path, alert: "ユーザーが見つかりません"
end

4. rescue_from で共通処理

1
2
3
4
5
6
7
8
9
class ApplicationController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

  def record_not_found
    render file: "#{Rails.root}/public/404.html", status: :not_found
  end
end

5. where + first を使用

1
2
user = User.where(id: params[:id]).first
# 見つからなければnil

よくある間違い

  • URLパラメータの検証なしにfindを実行
  • 論理削除(soft delete)されたレコードへのアクセス
  • マルチテナントアプリでスコープ外のレコードにアクセス

Ruby の他のエラー

最終更新: 2025-12-09