こちらの記事の解決編です。
ActiveRecord::RecordNotFoundのエラーは放置すべきか? - komagata
@hiroshi3110さんからズバリな答えをいただきました。
@komagata
... とかやってました。
ActiveRecord::Notfound がでるときはバグというのがすぐわかるように
— hiroshi (@hiroshi3110) 2015, 1月 6
怖話で実装
# lib/record_not_found_by_trustless_param.rb:
class RecordNotFoundByTrustlessParam < StandardError; end
# app/controllers/comics_controller.rb:
class ComicsController < ApplicationController
before_action :set_comic, only: :show
def show
end
private
def set_comic
unless @comic = Comic.find_by(id: params[:id])
raise RecordNotFoundByTrustlessParam
end
end
end
# app/controllers/application_controller.rb:
class ApplicationController < ActionController::Base
rescue_from RecordNotFoundByTrustlessParam, with: :not_found
private
def not_found
render file: "#{Rails.root}/public/404.html", layout: false, status: 404
end
end
@hiroshi3110さんの言うとおり、信頼出来ない外部からのidを元にしたfindで見つからない場合はRecordNotFoundByTrustlessParam
にし、rescue_fromで拾って404を出すようにしました。(404を動的テンプレートで出すのは良くないと思うのでpublic以下の静的ファイルを読む)
自分の中のベストプラクティスにしようと思いました。