LoginSignup
13
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-31

問題点

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

config/routes.rb
# .
# .
# .

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

ActiveStorage01.png

原因

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

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

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

ActiveStorage03.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'
}
13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6