ActiveStorageで恒久URLの取得をサポート(Rails v6.1.0)


今まで

今までの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を投げられました