私たちのシステムでは、RailsのActiveStorageを使用して画像を管理しています。
今回、Railsを6.0.3.6から6.1.3.2にアップデートしたところ下記のような問題が発生しました。
同様の問題を見つけきれなかったため質問させていただきます。原因や解決方法をご教示いただきたいです。
発生している問題
S3に保存している画像へのURLがアップデート前後で変わってしまい、アップデート前に保存していた画像が表示できない
再現するための手順
- Railsを6.0.3.6から6.1.3.2にアップデート
rails active_storage:update
を実行rails db:migrate
を実行- アップデート前に保存していた画像が表示されるページを開く
ソースコード
# 対象のクラス class Image < ApplicationRecord include ActiveStorageSupport::SupportForBase64 after_commit :process_variants has_one_base64_attached :file def provider_file_url key = file.variant(resize_to_limit: [500, 500]).key "#{ENV[‘BASE_URL']}/#{key}" end private def process_variants return unless file.attachment file.variant(resize_to_limit: [500, 500]).processed rescue StandardError nil end end # URLの呼び出し image_instance.provider_file_url
期待される動作
アップデート前後で同じURLが生成される
実際の動作
アップデート前後で、生成されるURLが異なる
例:
アップデート前
https://sample.net/variants/zvd2z2dafhrht3yy99l8w9zw54h8/3a8af9a41326f81dcc439e015ab90b5d9d078e2b00dd7d021c4d4ee650e5c6e0
アップデート後
https://sample.net/variants/zvd2z2dafhrht3yy99l8w9zw54h8/ac54d233b136b9f97f4d984f115d2e1c4695c2a0a3994c28d347637301445431
調査したこと
ActiveStorageの6.0.3.6
と6.1.3.2
の動作を比較したところ、以下のような違いがありました。
しかしこの原因まではたどり着けていません。
↓の2箇所にデバッグコード」を追加
① ActiveStorage::Variant
クラスのinitialize(ソースコード)
class ActiveStorage::Variant 省略 def initialize(blob, variation_or_variation_key) p '-----------------------------------------------------------------------------------------' p 'blob' p blob p 'variation_or_variation_key' p variation_or_variation_key p '-----------------------------------------------------------------------------------------' @blob, @variation = blob, ActiveStorage::Variation.wrap(variation_or_variation_key) end 省略 end
② ActiveStorage::Variation
クラスのencode
メソッド(ソースコード)
class ActiveStorage::Variation attr_reader :transformations class << self 省略 def encode(transformations) p '-----------------------------------------------------------------------------------------' p transformations p '-----------------------------------------------------------------------------------------' ActiveStorage.verifier.generate(transformations, purpose: :variation) end end 省略 end
provider_file_urlメソッドを実行
①
ActiveStorage6.0.3.6
"-----------------------------------------------------------------------------------------" "blob" #<ActiveStorage::Blob id: 999, key: "zvd2z2dafhrht3yy99l8w9zw54h7", filename: "sample.jpg", content_type: "image/jpeg", metadata: {"identified"=>true, "analyzed"=>true}, byte_size: 15789, checksum: "NwtXS6KRF1ty1WxXMicUew==", created_at: "2021-06-02 08:32:15"> "variation_or_variation_key" {:resize_to_limit=>[500, 500]} "-----------------------------------------------------------------------------------------"
ActiveStorage6.1.3.2
"-----------------------------------------------------------------------------------------" "blob" #<ActiveStorage::Blob id: 999, key: "zvd2z2dafhrht3yy99l8w9zw54h7", filename: "sample.jpg", content_type: "image/jpeg", metadata: {"identified"=>true, "analyzed"=>true}, byte_size: 15789, checksum: "NwtXS6KRF1ty1WxXMicUew==", created_at: "2021-06-02 17:32:15.000000000 +0900", service_name: "amazon"> "variation_or_variation_key" #<ActiveStorage::Variation:0x00007fa2db230430 @transformations={:format=>"jpg", :resize_to_limit=>[500, 500]}> "-----------------------------------------------------------------------------------------"
②
ActiveStorage6.0.3.6
"-----------------------------------------------------------------------------------------" {:resize_to_limit=>[500, 500]} "-----------------------------------------------------------------------------------------"
ActiveStorage6.1.3.2
"-----------------------------------------------------------------------------------------" {:format=>"jpg", :resize_to_limit=>[500, 500]} "-----------------------------------------------------------------------------------------"
試しに、encodeメソッドにformatキーを削除する処理を入れたところ、アップデート前と同様のURLが生成されるようになりました。
システム構成
アップデート前
Rails: 6.0.3.6
Ruby: 2.6.6
Gemfile.lock
activestorage (6.0.3.6) actionpack (= 6.0.3.6) activejob (= 6.0.3.6) activerecord (= 6.0.3.6) marcel (~> 1.0.0)
アップデート後
Rails: 6.1.3.2
Ruby: 2.6.6
Gemfile.lock
activestorage (6.1.3.2) actionpack (= 6.1.3.2) activejob (= 6.1.3.2) activerecord (= 6.1.3.2) activesupport (= 6.1.3.2) marcel (~> 1.0.0) mini_mime (~> 1.0.2)
あなたの回答
tips
プレビュー