今まで
今までのActiveStorageは rails_representation_url
を利用して恒久URLを発行できていたが、Railsガイドにも載っておらず割とハック的な感じでの利用でした
参考
https://qiita.com/shwld/items/07a2cdc19c38156e52ae
https://qiita.com/nmbakfm/items/f7c1f9ea77346891bb8c
ActiveStorageで公開URLの取得が可能に
Rails 6.1 にあげる作業をしていた時に素敵なアップデートを発見
https://github.com/rails/rails/releases/tag/v6.1.0
どうやら rails_storage_proxy_path(_url)
と言うのと rails_storage_redirect_path(_url)
と言うヘルパーが追加されたようです。
さっくりと手元で確認
class User < ApplicationRecord
has_one_attached :avator
end
user = User.first
rails_storage_proxy_path(user.avator)
# => "/rails/active_storage/blobs/proxy/*****/sample_avator.png"
rails_storage_redirect_path(user.avator)
# => "/rails/active_storage/blobs/redirect/*****/sample_avator.png"
なるほどblobsの後ろがproxyなのかredirectなのかで違うのですね
localhostで該当のURLにアクセスしたらちゃんと画像が表示されました
それぞれの挙動を確認してみた
rails_storage_proxy_urlにアクセスしてみる
HTTP/1.1 200 OK
で返ってきていることがみて取れる
Railsの方からファイルサービスにアクセスしてファイルデータを200ステータスで返してきている
$ curl -I http://localhost:3000/rails/active_storage/blobs/proxy/*****/sample_avator.png
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Date: Fri, 05 Feb 2021 02:27:10 GMT
ETag: W/"0749f09799210b2111ecea087fd54baa"
Last-Modified: Fri, 31 Dec 2010 15:00:00 GMT
Content-Type: image/png
Content-Disposition: inline; filename="sample_avator.png"; filename*=UTF-8''sample_avator.png
Cache-Control: max-age=3155695200, public
X-Request-Id: f15dee76-089f-46f9-b336-e965bec65b38
X-Runtime: 0.005844
rails_storage_redirect_urlにアクセスしてみる
HTTP/1.1 302 Found
で返ってきていることが見て取れる
Railsの方でファイルサービスに時限式URLを取得してきているそこにリダイレクトさせているのかな
$ curl -I http://localhost:3000/rails/active_storage/blobs/redirect/*****/sample_avator.png
HTTP/1.1 302 Found
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Date: Fri, 05 Feb 2021 02:27:31 GMT
Location: http://localhost:3000/rails/active_storage/disk/*****/sample_avator.png
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=300, private
X-Request-Id: 87c221d3-e894-41ef-bebf-e65f155a40a6
X-Runtime: 0.015136
結論
便利!
今までは自前でActiveStorageをラッピングして公開エンドポイントを取得できるメソッドを生やしていたので愛でたく削除PRを投げられました