ActiveStorageが生成したファイルパス(URL)をNo route matches回避のリダイレクト対象外にする


問題点

存在しないパスへアクセスがあった時に、ルート(/)へリダイレクトさせるルーティング設定をしている環境で、ActiveStorageを利用して画像ファイルを保存していたWEBアプリ上で画像が表示されなくなった。

config/routes.rb
# .
# .
# .

# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
if Rails.env.production?
match "*path" , to: redirect('/'), via: 'get'
end

原因

ActiveStorageを利用して取得した画像ファイルのURLがリダイレクトの対象になっていた。

show.html.erb
<%# 画像ファイルを表示 %>
<%= image_tag @user.avatar %>

# HTMLには↓のURLが出力される
# /rails/active_storage/blobs/xxxxx--xxxxx/icon.png

解決策

ActiveStorageを利用して取得する画像ファイルのURLをリダイレクトの対象外にすることで解決した。

参考:Rails Router Catchall Picks Up ActiveStorage Routes · Issue #31228 · rails/rails

config/routes.rb
# .
# .
# .

# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
get '*path', to: redirect('/'), constraints: lambda { |req|
  # 'rails/active_storage'が含まれているパスはリダイレクト対象外にする
  req.path.exclude? 'rails/active_storage'
}