レコードに存在しないデータにアクセスした
作成したコントローラーに
class ProfilesController < ApplicationController
def show
@profile = Profile.find(params[:id])
end
end
とだけ書いて適切な例外処理を書いていない場合、存在しないデータのURLにアクセスしようとすると
ActiveRecord::RecordNotFoundというエラーが出てしまいます。
このようにレコードにデータが存在しない場合の例外処理を書いて行きます。
rescueを用いた例外処理
rescue
を使うと、エラーが発生した場合次に行う処理を書くことができます。
今回、プロフィールコントローラーで発生したエラーを処理して行きます。
idを指定しクエリ実行後、レコードにそのパラメーターをもつデータが存在しない場合にプロフィールのindexページにリダイレクトされるような処理をrescue
を用いて書きます。
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でも同じ処理をしたい場合
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ページにリダイレクトされるようになります。