Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1.0 Active Storage CHANGELOG(翻訳)

概要

MITライセンスに基づいて翻訳・公開いたします。

参考: Active Storage の概要 - Railsガイド

rc1以後の更新はありません。

🔗 Active Storage CHANGELOG(v7.1.0.rc1)

🔗 Add expires_at option to ActiveStorage::Blob#signed_id by aki77 · Pull Request #48115 · rails/rails

ActiveStorage::Blob#signed_idexpires_atオプションを追加。

rails_blob_path(user.avatar, disposition: "attachment", expires_at: 30.minutes.from_now)
<%= image_tag rails_blob_path(user.avatar.variant(resize: "100x100"), expires_at: 30.minutes.from_now) %>

Aki
同CHANGELOGより

expires_atは期限切れになるまでURLが変わらない点がexpires_inと異なるそうです。

参考: Rails API signed_id -- ActiveStorage::Blob

🔗 Allow attaching File or Pathname to has_one_attached by dorianmariefr · Pull Request #45606 · rails/rails

属性の代入時に、以下のようにFilePathnameを添付できるようになった。

User.create!(avatar: File.open("image.jpg"))
User.create!(avatar: file_fixture("image.jpg"))

Dorian Marié
同CHANGELOGより

🔗 Active Storage CHANGELOG(v7.1.0.beta1)

🔗 Disable session in ActiveStorage blobs and representations proxy controllers by brunoprietog · Pull Request #48869 · rails/rails

CloudFlareなどのCDNでキャッシュをデフォルトで有効にできるようにするため、以下でセッションを無効化した。

修正: #44136

Bruno Prieto
同CHANGELOGより

🔗 Add tags to audio analyzer metadata by Gambitboy · Pull Request #48823 · rails/rails

ActiveStorage::Analyzer::AudioAnalyzerの出力にtagsメタデータを追加。

Keaton Roux
同CHANGELOGより

参考: 週刊Railsウォッチ20230809: オーディオアナライザのメタデータにタグを自動追加するようになった

🔗 Add an option to transform AS variants in the background by shouichi · Pull Request #47473 · rails/rails

バリアントにpreprocessedオプションを追加。

Active Storageのバリアント(サイズ違いの別画像)は、必要が生じたときにその都度処理されるが、確実にアクセスされることが事前にわかっている場合は事前に処理したいことがある。

バリアントを宣言するときに以下のようにpreprocessedオプションを追加できるようになった。

class User < ApplicationRecord
  has_one_attached :avatar do |attachable|
    attachable.variant :thumb, resize_to_limit: [100, 100], preprocessed: true
  end
end

Shouichi Kamiya
同CHANGELOGより

参考: 週刊Railsウォッチ20230802: Active Storageのバリアントをバックグラウンドで事前変換するオプションが追加

🔗 Fix variants not included when eager loading multiple records containing a single attachment by russellporter · Pull Request #47370 · rails/rails

添付ファイルが1個ある複数のレコードをeager loadingしたときにバリアントが含まれていなかったのを修正。

has_one_attachedリレーションでwith_attached_#{name}スコープを使ったときに、添付ファイルのバリアントがeager loadingされていなかった。

Russell Porter
同CHANGELOGより

参考: これは7-0-stableにもバックポートされました(#49231)。

🔗 Allow an ActiveStorage attachment to be removed via a form post by natematykiewicz · Pull Request #48339 · rails/rails

フォームのPOSTでActive Storage添付ファイルを削除できるようになった。

添付ファイルの削除は、以下のようにnilを渡せば既に削除できるようになっている。

User.find(params[:id]).update!(avatar: nil)

ただしフォームからはnilパラメータをPOSTできない(空文字列""のみPOSTできる)。しかしこれは署名済みblob idとして扱われるため、空文字列をPOSTするとActiveSupport::MessageVerifier::InvalidSignature: mismatched digestエラーが発生する。

この修正によって、nilも空文字も削除として扱われるようになり、添付ファイルを以下で削除できるようになった。

User.find(params[:id]).update!(params.require(:user).permit(:avatar))

Nate Matykiewicz
同CHANGELOGより

参考: 週刊Railsウォッチ20230621: ActiveStorageの添付ファイルをフォームのPOSTで削除可能になった

🔗 Remove mini_mime usage in favour of marcel by vipulnsward · Pull Request #47754 · rails/rails

mini_mime gemを削除してmarcel gemに一本化。

同じような使われ方をしているライブラリが2つある。この変更によってmini_mimeへの依存が削除され、mercelにある類似のメソッドを使うようになる。

Vipul A M
同CHANGELOGより

discourse/mini_mime - GitHub

rails/marcel - GitHub

参考: 週刊Railsウォッチ20230425: mini_mimeを削除してmarcelに完全移行

🔗 Allow destroying active storage variants by shouichi · Pull Request #47150 · rails/rails

Active Storageのバリアントをdestroyできるようになった。

User.first.avatar.variant(resize_to_limit: [100, 100]).destroy

Shouichi Kamiya, Yuichiro NAKAGAWA, Ryohei UEDA
同CHANGELOGより

参考: 週刊Railsウォッチ20230425: Active Storageのvariantを個別に削除可能にした

🔗 Extract sample rate in audio analyzer by matteeyah · Pull Request #47749 · rails/rails

ActiveStorage::Analyzer::AudioAnalyzerの出力にsample_rateメタデータを追加。

Matija Čupić
同CHANGELOGより

参考: 週刊Railsウォッチ20230412: ActiveStorage::Analyzer::AudioAnalyzersample_rateも取得できるようになった

🔗 Remove deprecated purge and purge_later methods from the attachme… · rails/rails@18e53fb

非推奨化されていたpurgeメソッドとpurge_laterメソッドを添付ファイルの関連付けから削除。

Rafael Mendonça França
同CHANGELOGより

参考: Deprecate usage of purge and purge_later from the association extension. by intrip · Pull Request #42506 · rails/rails

🔗 Remove deprecated behavior when assigning to a collection of attachments · rails/rails@c720b7e

添付ファイルのコレクションに代入するときの非推奨化された振る舞いを削除。

今後はコレクションへの追加ではなく、コレクションが置き換わるようになる。

Rafael Mendonça França
同CHANGELOGより

参考: Deprecate replace_on_assign_to_many by santib · Pull Request #42596 · rails/rails

🔗 Remove deprecated ActiveStorage::Current#host and `ActiveStorage::C… · rails/rails@0591de5

ActiveStorage::Currentで非推奨化されていた#hostメソッドと#host=メソッドを削除。

Rafael Mendonça França
同CHANGELOGより

参考: Fix #41388 by preserving protocol and port when generating routes by santib · Pull Request #41391 · rails/rails

🔗 Remove deprecated invalid default content types in Active Storage con… · rails/rails@4edaa41

Active Storage設定で非推奨化されていた無効なContent-Typeを削除。

Rafael Mendonça França
同CHANGELOGより

参考: Active Storage: deprecate invalid default content types by ghiculescu · Pull Request #42227 · rails/rails

🔗 Add missing preview event to ActiveStorage::LogSubscriber by chaadow · Pull Request #46291 · rails/rails

ActiveStorage::LogSubscriberにこれまで出力されていなかったpreviewイベントを追加。

previewActiveStorage::Previewerで監視されるが、Active StorageのLogSubscriberクラス内に追加されていなかった。

この変更によって、Rails.logger内の他のActive Storageイベント(uploaddownloadなど)と同様に、プレビュー発生時のログも取れるようになる。

Chedli Bourguiba
同CHANGELOGより

🔗 FFmpeg (5.0+) has updated the tag where rotation info is retrieved from by hahmed · Pull Request #45837 · rails/rails

FFmpeg 5.0以降でのローテーション値の取得を修正。

FFmpeg 5.0以降では、ローテーション(動画の回転)値がタグから削除され、side_data_listで値を取得できるようになっている。
この更新によって、値が-90-270の場合は動画が回転したことを示せるようになった。

Haroon Ahmed
同CHANGELOGより

参考: これはRails 7.0.6に含まれています

🔗 Touch model records after ActiveStorage::Blob is analyzed by natematykiewicz · Pull Request #45579 · rails/rails

ActiveStorage::Blobanalyze後に、対応する全モデルの添付ファイルをtouchするようになった。

これにより、最初のanalyze_laterが完了する前にレコードがリクエストされてキャッシュエントリが作成される競合状態が修正され、他の何かがレコードを更新するまでキャッシュエントリが無効化されないようになる。また、blobが再度analyzeされる場合にもキャッシュエントリを無効化するようになる(これはアナライザのバグを修正したときや新しいアナライザを追加した場合に便利)。

Nate Matykiewicz
同CHANGELOGより

参考: 週刊Railsウォッチ20220801: ActiveStorage::Blobのアナライズ後にモデルのレコードをtouchするよう修正

🔗 Allow to use pre-defined variants for previews by richardboehme · Pull Request #45098 · rails/rails

添付ファイルでpreviewrepresentationを呼び出したときにも定義済みのバリアントを利用できるようになった。

class User < ActiveRecord::Base
  has_one_attached :file do |attachable|
    attachable.variant :thumb, resize_to_limit: [100, 100]
  end
end
<%= image_tag user.file.representation(:thumb) %>

Richard Böhme
同CHANGELOGより

参考: 週刊Railsウォッチ20220725: Active Storageのpreviewrepresentationでも定義済みバリアントを使えるようにする

🔗 Make ActiveStorage attach method be consistent between one and many by santib · Pull Request #45397 · rails/rails

attachメソッドが、常に添付ファイルを返すようになった。ただしレコードが永続化済みかつ未変更で、かつsaveが失敗した場合はnilを返す。

Santiago Bartesaghi
同CHANGELOGより

参考: 週刊Railsウォッチ20220627: Active StorageのattachメソッドをAttached::Oneについても修正

🔗 Fix #41661 attaching multiple times within transaction by santib · Pull Request #42300 · rails/rails

トランザクション内でattachが複数回呼び出された場合にファイルが正しくアップロードされない問題を修正。

以下のコード例における設定済みサービスへのアップロードは、最後のファイルを除いて失敗する。

ActiveRecord::Base.transaction do
  user.attachments.attach({
    content_type: "text/plain",
    filename: "dummy.txt",
    io: ::StringIO.new("dummy"),
  })
  user.attachments.attach({
    content_type: "text/plain",
    filename: "dummy2.txt",
    io: ::StringIO.new("dummy2"),
  })
end

assert_equal 2, user.attachments.count
assert user.attachments.first.service.exist?(user.attachments.first.key)  # 失敗

アップロード待ちのサブ変更をトラッキングして、トランザクションがコミットされたらアップロードすることで、この問題を修正した。

修正: #41661

Santiago Bartesaghi, Bruno Vezoli, Juan Roig, Abhay Nikam
同CHANGELOGより

参考: 週刊Railsウォッチ20220613: Active Storage: トランザクション内でattachの複数回実行が失敗するのを修正

🔗 Raise exception if Active Storage is configured and config.active_storage.service is not explicitly set by ghousemohamed · Pull Request #44372 · rails/rails

config.active_storage.serviceにサービスが未設定の場合に例外を発生するようになった。

Active Storageが設定済みで、対応する環境のコンフィグファイルにconfig.active_storage.serviceが設定されていない状態でActive Storageを使おうとしたときに、わかりやすい例外メッセージを出力するようになる。

Ghouse Mohamed
同CHANGELOGより

Rails 7.1: config.active_storage.serviceが未設定の場合にRuntimeErrorで通知(翻訳)

🔗 Fixes ActiveStorage proxy downloads of files over 5mb in S3-like storages by feliperaul · Pull Request #45102 · rails/rails

プロキシモードでの5MBを超えるファイルダウンロードを修正。

従来は、S3などのサービスで5MBを超えるファイルをプロキシモードで表示またはダウンロードしようとすると、5.2MBあたりで壊れたメッセージが返されたり、ダウンロードがランダムに停止することがあった。
ActiveStorage::Blobs::ProxyControllerでサービス上のこのような巨大ファイルを正しくストリーミングできるように修正したことで、問題なくクライアントで扱えるようになった。

修正: #44679

Felipe Raul
同CHANGELOGより

参考: この修正はRails 7.0.4に含まれています

🔗 Return the blob/blobs when #attach is able to save the record by ghousemohamed · Pull Request #44439 · rails/rails

添付ファイルをレコードにsaveするとblobオブジェクトを返すようになった。

従来は、添付ファイルをsaveしても添付ファイルを含むblobが返されなかった。
添付ファイルをレコードにsaveするときに#attachメソッドを使うようにしたことで、ファイルが添付された単一のblobまたはblobの配列を返すようになった。添付ファイルのsaveが失敗した場合はfalseを返す。

Ghouse Mohamed
同CHANGELOGより

参考: 週刊Railsウォッチ20220308: #attachした添付ファイルの保存に成功するとblobを返すようになった

🔗 Don't stream redirect controller responses by lukel97 · Pull Request #44244 · rails/rails

リダイレクトモードではレスポンスをストリーミングしないようになった。

従来は、リダイレクトモードプロキシモードのどちらもレスポンスをストリーミングしていたため、新しいスレッドが作成されてコネクションプールのコネクションが漏洩する可能性があった。
しかし、リダイレクトモードはデータを実際には送信しないため、ストリーミングは不要。

Luke Lau
同CHANGELOGより

参考: 週刊Railsウォッチ20220131: Active Storageのリダイレクトモードでレスポンスをストリーミングしないようにした

🔗 Safe for Direct Uploads in js Libraries or Frameworks by Roriz · Pull Request #47773 · rails/rails

ライブラリやフレームワークでのダイレクトアップロードを安全に行えるようにした。

ダイレクトアップロード中のカスタムヘッダーを有効にしたことで、AuthorizationのBearerトークンや他の形式の認証トークンをヘッダー経由で含められるようになった。

Radamés Roriz
同CHANGELOGより

参考: Bearerトークン - Wikipedia


以前の変更については7-0-stableのCHANGELOGを参照。

関連記事

Rails 7.1に入る主要な機能まとめ(1)update_attribute!、CTEサポートほか(翻訳)

Rails 7.1に入る主要な機能まとめ(2)error_highlight対応、routes --grepほか(翻訳)

Rails 7.1に入る主要な機能まとめ(3)Docker関連ファイル導入ほか(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。