1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【rails】 存在しないデータにアクセスした時の例外処理

Last updated at Posted at 2021-09-23

レコードに存在しないデータにアクセスした

作成したコントローラーに

profile_controller.rb
class ProfilesController < ApplicationController

  def show
    @profile = Profile.find(params[:id])
  end

end

とだけ書いて適切な例外処理を書いていない場合、存在しないデータのURLにアクセスしようとすると
スクリーンショット 2021-09-23 14.06.55.png
ActiveRecord::RecordNotFoundというエラーが出てしまいます。
このようにレコードにデータが存在しない場合の例外処理を書いて行きます。

rescueを用いた例外処理

rescueを使うと、エラーが発生した場合次に行う処理を書くことができます。
今回、プロフィールコントローラーで発生したエラーを処理して行きます。
idを指定しクエリ実行後、レコードにそのパラメーターをもつデータが存在しない場合にプロフィールのindexページにリダイレクトされるような処理をrescueを用いて書きます。

profile_controller.rb
class ProfilesController < ApplicationController

  def show
    @profile = Profile.find(params[:id])

    #以下を追記
    rescue ActiveRecord::RecordNotFound => e
    redirect_to profiles_path
  end

end

この記述によってプロフィールコントローラーのshowアクションがデータベースからデータを取得する処理を実行し、ActiveRecord::RecordNotFoundというエラーがでてもプロフィールのindexページにリダイレクトされるようになりました。

rescue_fromを用いた例外処理

rescue_fromは、例外を1つのコントローラ全体で扱えるようになります。
すなわちshowアクションの他に、edit、update、deleteでも同じ処理をしたい場合

profile_controller.rb
class ProfilesController < ApplicationController
#以下を追記
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  def show
    @profile = Profile.find(params[:id])
  end

  def edit
    @profile = Profile.find(params[:id])
  end
#省略
#以下を追記
  private

  def record_not_found
    redirect_to profiles_path
  end

end

このように処理を書くことで、プロフィールコントローラーのデータを取得する処理を実行するアクションから存在しないデータにアクセスした場合、indexページにリダイレクトされるようになります。

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?