画像の更新などによりActiveStorageのBlobが削除されたにもかかわらず、URLがキャッシュされていたなどの理由により削除された画像にアクセスが来た場合、下記エラーが報告される。
ActiveRecord::RecordNotFoundactive_storage/blobs#show Couldn't find ActiveStorage::Blob with 'id'=xxx
別段この動きに不満はないが、bugsnagに大量にこのエラーが飛んできて重要なエラー通知に埋もれてしまいかねないので404にしたい。
環境
Service | Version |
---|---|
Ruby | 2.7.3 |
Ruby on Rails | 6.0.3 |
対応
ActiveStorageのcontrollerは app/controllers/active_storage/
以下の対応するcontrollerに置けばオーバーライドできるので、そちらでrescueする。
app/controllers/active_storage/base_controller.rb
# frozen_string_literal: true # The base class for all Active Storage controllers. class ActiveStorage::BaseController < ActionController::Base include ActiveStorage::SetCurrent protect_from_forgery with: :exception rescue_from ActiveRecord::RecordNotFound, with: :render_404 private def render_404 head :not_found end end
所感
オーバーライドは何かあった場合が怖いので、もっといい方法があればそちらにしたい。。。
けど app/controllers/active_storage/blobs_controller.rb
には下記のように書いているので、オーバーライドが推奨方法なのかもしれない。
Note: These URLs are publicly accessible. If you need to enforce access protection beyond the security-through-obscurity factor of the signed blob references, you'll need to implement your own authenticated redirection controller.