10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-02-05

今まで

今までの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

image.png

どうやら 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にアクセスしたらちゃんと画像が表示されました
スクリーンショット 2021-02-05 11.26.13.png

それぞれの挙動を確認してみた

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

10
7
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
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?