megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

削除したActiveStorageへのアクセスは404にしたい

画像の更新などにより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.