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

Rails 8.0 Changelog(全項目リンク付き)

【速報】Rails 8.0.0がリリースされました

Rails 8.0(v8.0.0タグ)は、7.2.0リリースから半年後のリリースということもあり、メジャーリリースとしてはChangelogの変更件数が少なめなのが特徴です。機能面では、Strong Parametersのexpect追加や、MySQL 5.5のサポート廃止が目につきます。大きなbreaking changesも今のところ見当たりません。

以下、Rails 8.0のChangelogを件数の多い順に見ていきます。なお、原則として削除のChangelogは、その項目が非推奨化されたときのプルリク情報にリンクしています。

なお、以下の機能にはChangelogがありません。

🔗 Active Record(56件)

Rails 8.0.0 (November 07, 2024)

🔗 Respect db config query_cache in railtie executor hook by zzak · Pull Request #53484 · rails/rails

database.ymlでのquery_cache: falseサポートを修正。

query_cache: falseはActive Recordのクエリキャッシュ全体を無効にしなくなった。

zzak
同Changelogより

Rails 8.0.0.rc2 (October 30, 2024)

🔗 NULLS NOT DISTINCT works with UNIQUE CONSTRAINT as well as UNIQUE INDEX by kamipo · Pull Request #53456 · rails/rails

NULLS NOT DISTINCTが、UNIQUE INDEXと同様にUNIQUE CONSTRAINTでも使えるようにした。

Ryuta Kamizono
同Changelogより

🔗 db:prepare no longer loads seed when non-primary db is created by flavorjones · Pull Request #53379 · rails/rails

primary以外のデータベースが作成されているときにdb:prepareタスクでseedを読み込まないよう修正。

従来のdb:prepareタスクは、新規データベースが作成されるたびにseedを読み込んでいたため、既存の環境にデータベースを追加するとデータが失われる可能性があった。

db:prepareの実行中にseedを読み込むかどうかを制御する新しいデータベース構成プロパティseedsが導入された。このプロパティのデフォルトは、プライマリデータベース構成の場合はtrue、それ以外の場合は falseになる。

修正: #53348

Mike Dalessio
同Changelogより

🔗 Translate no connection to the server to ConnectionNotEstablished by wata727 · Pull Request #53400 · rails/rails

PG::UnableToSend: no connection to the serverが、コネクション関連の例外としてリトライ可能になった。

Kazuma Watanabe
同Changelogより

🔗 Fix strict loading propagation even if statement cache is not used by kamipo · Pull Request #53398 · rails/rails

ステートメントキャッシュが使われていない場合にもstrict loadingが伝搬するよう修正。

Ryuta Kamizono
同Changelogより

🔗 Allow rename_enum accepts two from/to name arguments as rename_table does so by kamipo · Pull Request #53396 · rails/rails

参考: 週刊Railsウォッチ20241108: rename_enumにリネーム前/リネーム後の2つの名前を渡せるよう修正

rename_enumに、rename_tableと同様にリネーム前の名前とリネーム後の名前をオプショナルでない形で渡すよう修正。

Ryuta Kamizono
同Changelogより

Rails 8.0.0.rc1 (October 19, 2024)

🔗 以下の非推奨項目を削除

(以下のリンク先は非推奨化時のプルリク情報)

Rafael Mendonça França

🔗 Allow ActiveRecord's #insert to work with an empty hash of attributes when using MySQL by davidstosik · Pull Request #53244 · rails/rails

ActiveRecord::Base.insertに空ハッシュを渡すと誤ったSQLクエリが生成されるのを修正。

David Stosik
同Changelogより

🔗 allow to autosave associations with polymorphic has many through join… by doits · Pull Request #53176 · rails/rails

inverse_of で指定されたポリモーフィックjoinテーブルでレコードを保存できるよう修正。

Markus Doits
同Changelogより

🔗 [Fix #40109] Incorrect joins for polymorphic has_many through: with association scope by joshuay03 · Pull Request #51507 · rails/rails

ポリモーフィックなhas_many through:を利用中に適用される関連付けjoinスコープが古くなる場合があったのを修正。

Joshua Young
同Changelogより

🔗 Allow ActiveRecord::QueryMethods#pluck to accept hash args with symbol & string values by joshuay03 · Pull Request #51676 · rails/rails

ActiveRecord::Base#pluckで、以下のようにハッシュ引数の値をシンボルと文字列の両方で渡せるようになった。

Post.joins(:comments).pluck(:id, comments: :id)
Post.joins(:comments).pluck("id", "comments" => "id")

Joshua Young
同Changelogより

補足

#51676は、7.2で追加された以下の機能をさらに拡張したものです。

Rails 7.2: ActiveRecord::Base#pluckにハッシュ値を渡せるようになった(翻訳)

🔗 Make Float distinguish between float4 and float8 in PostgreSQL by tnagatomi · Pull Request #53107 · rails/rails

参考: 週刊Railsウォッチ20241024: PostgreSQLとMySQLのfloat関連改修

PostgreSQLの浮動小数点でfloat4float8を区別するよう修正。

修正: #52742

Ryota Kitazawa, Takayuki Nagatomi
同Changelogより

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Allow drop_table to accept an array of table names by sobrinho · Pull Request #52773 · rails/rails

drop_tableにテーブル名の配列を渡せるようになった。

これにより、1回の呼び出しで複数のテーブルをDROPできる。

ActiveRecord::Base.lease_connection.drop_table(:users, :posts)

Gabriel Sobrinho
同Changelogより

🔗 Add if_not_exists option to add_enum_value by arzezak · Pull Request #52916 · rails/rails

add_enum_valueメソッドの:if_not_existsオプションでPostgreSQLのIF NOT EXISTSをサポートするようになった。

Ariel Rzezak
同Changelogより

🔗 Load schema when running db:migrate on fresh dbs by jeremy · Pull Request #53474 · rails/rails

新しいデータベースでdb:migrateを実行したときに、マイグレーション実行前にデータベーススキーマを読み込むよう修正。

Andrew Novoselac, Marek Kasztelnik
同Changelogより

🔗 Fix .left_outer_joins when multiple associations have the same child. by garrettblehm · Pull Request #52850 · rails/rails

子の関連付けは同じだが親が異なる複数の関連付けで .left_outer_joins が一部の親をjoinしない問題を修正。

修正前は、同じ子の関連付けで.left_outer_joinsを使うと、片方の親だけがjoinされていた。

修正後は両方の親が正しくjoinされるようになった。

修正: #41498

Garrett Blehm
同Changelogより

🔗 Deprecate unsigned_float and unsigned_decimal short-hand column methods by kamipo · Pull Request #52828 · rails/rails

参考: 週刊Railsウォッチ20241024: PostgreSQLとMySQLのfloat関連改修

カラムメソッドのショートハンドであるunsigned_floatunsigned_decimalを非推奨化。

MySQL 8.0.17以降、FLOATDOUBLEDECIMAL型のカラムのUNSIGNED属性が非推奨となった。このようなカラムには、代わりにシンプルなCHECK制約の利用を検討すること。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 11.1.1 数値データ型の構文

Ryuta Kamizono
同Changelogより

🔗 Drop MySQL 5.5 support by kamipo · Pull Request #52817 · rails/rails

MySQL 5.5のサポートを廃止。

MySQL 5.5は、Railsコアでサポートしている精度付き(小数以下6桁)datetime型をサポートしていない唯一のバージョンである。今後は、精度付きdatetimeをサポートする最初のバージョンであるMySQL 5.6.4以降をサポートする。

Ryuta Kamizono
同Changelogより

🔗 Allow async queries in transactional fixtures by casperisfine · Pull Request #52806 · rails/rails

Active Record の非同期クエリが、トランザクショナルfixture互換になった。

従来のトランザクショナルfixtureは、すべてのクエリが同じコネクションを使う形を強制するため、非同期クエリが無効だった。

改修後、非同期クエリはトランザクショナルfixtureがピン留めしたコネクションを使うようになった。この振る舞いは、production環境に非常に近い。

Jean Boussier
同Changelogより

🔗 Fix binary decryption on Postgres by djmb · Pull Request #52729 · rails/rails

(PostgreSQL)バイナリデータのデシリアライズを、復号の後に行うよう修正。

これにより、PostgreSQLの PG::Connection.unescape_byteaが復号処理の前に呼び出されるようになった。

Donal McBreen
同Changelogより

🔗 Ensure ActiveRecord::Encryption.config is always ready before access by maximerety · Pull Request #52669 · rails/rails

ActiveRecord::Encryption.config が、DBアクセスの前に常に読み込み完了するよう修正。

修正前のActiveRecord::Encryptionのコンフィグは、ActiveRecord::Base が読み込まれるまで先延ばし(defer)されていた。そのため、ActiveRecord::Baseが読み込みが完了する前にActiveRecord::Encryption.configプロパティにアクセスすると、誤った結果が返された。

ActiveRecord::Encryptionには独自の読み込み用フックが追加され、必要に応じてただちにコンフィグが設定されるようになった。

ActiveRecord::Baseが読み込まれると、lazy loadの場合でもActiveRecord::Encryptionの読み込みがトリガーされるため、ActiveRecord::Baseを使う前に設定を読み込み完了するという元の振る舞いは維持される。

Maxime Réty
同Changelogより

🔗 [#52698] Fix TimeZoneConverter#== method so objects will be properly compared by their type, scale, limit & precision. by ruyrocha · Pull Request #52699 · rails/rails

TimeZoneConverter#==メソッドが追加された。これにより、このオブジェクトの型、スケール、制約、精度を正しく比較できるようになる。

修正: #52699

Ruy Rocha
同Changelogより

🔗 Add support for SQLite3 full-text-search and other virtual tables by zachasme · Pull Request #52354 · rails/rails

SQLite3の全文検索機能や、その他の仮想テーブルをサポート。

従来は、SQLite3の仮想テーブルを追加するとschema.rbで問題が生じた。

修正後は、create_virtual_tableで安全に仮想テーブルを追加可能になった。

Zacharias Knudsen
同Changelogより

🔗 Allow use of alternative database interfaces by tsvallender · Pull Request #52656 · rails/rails

Active Recordコンフィグのdatabase_cliオプションで、別のデータベースのCLIインターフェイスを指定可能になった。

Rails.application.configure do
  config.active_record.database_cli = { postgresql: "pgcli" }
end

T S Vallender
同Changelogより

🔗 support dumping PostgreSQL inheritance & partitioning options to schema.rb by waymondo · Pull Request #50475 · rails/rails

PostgeSQLアダプタのテーブル継承のダンプと、ネイティブのパーティショニングテーブル定義をサポート。

Justin Talbott
同Changelogより

🔗 Add support for ActiveRecord::Point type casts using hash values by sdrew · Pull Request #44841 · rails/rails

ActiveRecord::Point型キャストでHash値をサポート。

これにより、ActiveRecord::Pointを数値の:x キーと:yキーを持つハッシュからキャストまたはシリアライズ可能になり、文字列と配列値の既存のキャストの機能も反映される。文字列キーとシンボルキーの両方をサポートする。

class PostgresqlPoint < ActiveRecord::Base
  attribute :x, :point
  attribute :y, :point
  attribute :z, :point
end

val = PostgresqlPoint.new({
  x: '(12.34, -43.21)',
  y: [12.34, '-43.21'],
  z: {x: '12.34', y: -43.21}
})
ActiveRecord::Point.new(12.32, -43.21) == val.x == val.y == val.z

Stephen Drew
同Changelogより

🔗 SQLite non-GVL-blocking, fair retry interval busy handler by fractaledmind · Pull Request #51958 · rails/rails

SQLite3::Database#busy_timeout#busy_handler_timeout=に置き換わった。

GVLブロッキングの発生しない、リトライ間隔の公平なビジーハンドラーを実装している。

Stephen Margheim
同Changelogより

🔗 Handle SQLite3::BusyException to raise ActiveRecord::StatementTimeout by n-studio · Pull Request #52577 · rails/rails

SQLite3AdapterのSQLite3::BusyExceptionActiveRecord::StatementTimeoutに変換するよう修正。

Matthew Nguyen
同Changelogより

🔗 Update PostgreSQLAdapter#extensions to include schema name by afn · Pull Request #52313 · rails/rails

enable_extensionステートメント内のスキーマ名がdb/schema.rbに含まれるよう修正。

スキーマダンパーは、スキーマが現在と異なる場合は、生成されたenable_extensionステートメント内のスキーマ名を反映するようになった。

たとえば以下のマイグレーションがあるとする。

enable_extension "heroku_ext.pgcrypto"
enable_extension "pg_stat_statements"

このとき、生成したスキーマダンプにも以下が含まれるようになる。

enable_extension "heroku_ext.pgcrypto"
enable_extension "pg_stat_statements"

Tony Novak
同Changelogより

🔗 EncryptedAttributeType#type should return cast_type's type. by nashby · Pull Request #52247 · rails/rails

ActiveRecord::Encryption::EncryptedAttributeType#typeが実際のキャスト型を返すよう修正。

Vasiliy Ermolovich
同Changelogより

🔗 Bulk insert fixtures on SQLite by lazaronixon · Pull Request #52562 · rails/rails

SQLite3Adapterでfixtureの挿入をバルク実行するようになった。

従来はfixture 1件ごとにINSERTコマンドを実行していたが、改修後は1個のバルクINSERTコマンドに集約されるようになった。

Lázaro Nixon
同Changelogより

🔗 Allow disable_extension to be called with schema-qualified name by afn · Pull Request #52452 · rails/rails

PostgreSQLAdapterのdisable_extension呼び出しにスキーマ修飾名を渡せるようになった。

enable_extension と同様に、disable_extensionメソッドにもスキーマ修飾名(例: disable_extension "myschema.pgcrypto")を渡して呼び出し可能になった。PostgreSQLのDROP EXTENSIONは実際にはスキーマ名を受け取らない(CREATE EXTENSIONとは異なる)ため、結果のSQLステートメントでは単に拡張子を用いて指定する(例: DROP EXTENSION IF EXISTS "pgcrypto")。

Tony Novak
同Changelogより

🔗 Make create_schema / drop_schema reversible in migrations by afn · Pull Request #52451 · rails/rails

create_schemadrop_schemaがマイグレーションで逆進可能になった。

従来のcreate_schemadrop_schemaは、マイグレーションで逆進操作を行えなかった。

Tony Novak
同Changelogより

🔗 Support batching using custom columns by fatkodima · Pull Request #52384 · rails/rails

主キー以外のカスタムカラムでもin_batchesによるバッチングがサポートされた。

Product.in_batches(cursor: [:shop_id, :id]) do |relation|
  # relationで何かする
end

fatkodima
同Changelogより

🔗 Ensure SQLite transaction default to IMMEDIATE mode by fractaledmind · Pull Request #50371 · rails/rails

SQLiteで可能な場合はIMMEDIATEを使うようになった。

SQLite3アダプタに対して実行されるトランザクションは、デフォルトで IMMEDIATEモードになり、コンカレンシーサポートの改善とビジー例外の回避が行われる。

Stephen Margheim
同Changelogより

🔗 Raise specific exception when a connection is not defined by hharen · Pull Request #52298 · rails/rails

参考: 週刊Railsウォッチ20240808: コネクションが未定義の場合にわかりやすい例外を表示するようになった

コネクションが未定義の場合にraiseする例外が追加された。

新しいConnectionNotDefined例外は、リクエストされたコネクションの詳細情報「コネクション名」「シャード」「ロールアクセサ」を提供する

Hana Harencarova, Matthew Draper
同Changelogより

🔗 Delete the deprecated constant ActiveRecord::ImmutableRelation by fxn · Pull Request #52321 · rails/rails

非推奨化されていたActiveRecord::ImmutableRelation定数を削除。

Xavier Noria
同Changelogより

🔗 [Fix #48688] Duplicate callback execution when child autosaves parent with has_one and belongs_to by joshuay03 · Pull Request #49847 · rails/rails

参考: 週刊Railsウォッチ20240807: 子レコードが親レコードを自動保存するときのコールバックが重複実行されることがあったのを修正

子がhas_onebelongs_toで親を自動保存する場合にコールバックが重複実行されていたのを修正。

修正前は、新しい子レコードを新しい関連付けられた親レコードで永続化すると、before_validationafter_validationbefore_saveafter_saveコールバックが2回実行されていた。

修正後、これらのコールバックは期待どおりに1回だけ実行されるようになった。

Joshua Young
同Changelogより

🔗 Introduce compressor option to ActiveRecord::Encryption::Encryptor by heka1024 · Pull Request #51735 · rails/rails

参考: 週刊Railsウォッチ20240807: ActiveRecord::Encryption::Encryptor:compressorオプションで圧縮アルゴリズムを渡せるようになった

ActiveRecord::Encryption::Encryptor:compressorオプションがサポートされ、利用する圧縮アルゴリズムをカスタマイズ可能になった。

module ZstdCompressor
  def self.deflate(data)
    Zstd.compress(data)
  end

  def self.inflate(data)
    Zstd.decompress(data)
  end
end

class User
  encrypts :name, compressor: ZstdCompressor
end

compress: falseを渡すことで圧縮を無効化できる。

class User
  encrypts :name, compress: false
end

heka1024
同Changelogより

🔗 Add condensed #inspect for Pool, Adapter, Config by skipkayhil · Pull Request #50405 · rails/rails

これはRails 7.2で反映済みです。

以下のメソッドにスリムな表示の#inspectメソッドを追加。

  • ConnectionPool
  • AbstractAdapter
  • DatabaseConfig

Hartley McGuire
同Changelogより

🔗 Add .shard_keys, .sharded?, & .connected_to_all_shards methods to AR Models by HeyNonster · Pull Request #51009 · rails/rails

参考: 週刊Railsウォッチ20240709: シャーディング用メソッド.shard_keys.sharded?.connected_to_all_shardsが追加

シャード用に.shard_keys.sharded?.connected_to_all_shardsメソッドを追加。

class ShardedBase < ActiveRecord::Base
    self.abstract_class = true

    connects_to shards: {
      shard_one: { writing: :shard_one },
      shard_two: { writing: :shard_two }
    }
end

class ShardedModel < ShardedBase
end

ShardedModel.shard_keys => [:shard_one, :shard_two]
ShardedModel.sharded? => true
ShardedBase.connected_to_all_shards { ShardedModel.current_shard } => [:shard_one, :shard_two]

Nony Dutton
同Changelogより

🔗 [ActiveRecord] Add option filter on in_order_of by igordepolli · Pull Request #51761 · rails/rails

参考: 週刊Railsウォッチ20240625: Active Recordのin_order_offilterオプションを追加

filterオプションにin_order_ofが追加された。
これは結果をフィルタせずに、ソートによって特定の値を優先する。

Igor Depolli
同Changelogより

🔗 [Fix #51129] Fix issue with IDs reader on preloaded associations for composite primary keys #51167

複合主キーを使うモデルでプリロードされた関連付けに対して、IDリーダーメソッドが期待通りの結果を返さない問題を修正。

Jay Ang
同Changelogより

🔗 Allow one to set strict_loading_mode globally by gjtorikian · Pull Request #51339 · rails/rails

strict_loading_modeをモデル内とグローバルのどちらにも設定可能になった。

デフォルトは:allだが、:n_plus_one_onlyに変更可能。

Garen Torikian
同Changelogより

🔗 Add ActiveRecord::Relation#readonly? by theodorton · Pull Request #51371 · rails/rails

参考: 週刊Railsウォッチ20240620: ActiveRecord::Relation.readonly?を追加

ActiveRecord::Relation.readonly?メソッドを追加。

リレーションがreadonlyとマーキングされているかどうかを反映する。

Theodor Tonum
同Changelogより

🔗 Raise a descriptive error when a Store column is misconfigured by flavorjones · Pull Request #51898 · rails/rails

ActiveRecord::Storeを改良して、カラムが構造化されていない場合(PostgreSQLのhstore/jsonやMySQLのjson など)、またはActiveRecord.store経由でシリアライズ可能と宣言されていない場合に発生する例外をわかりやすくした。

従来は、アクセサの読み出し・書き込みで以下のNoMethodError が発生していた。

NoMethodError: undefined method `accessor' for an instance of ActiveRecord::Type::Text

改修後は、よりわかりやすいConfigurationErrorをraiseする。

ActiveRecord::ConfigurationError: the column 'metadata' has not been configured as a store.

Mike Dalessio
同Changelogより

🔗 [Fix #51720] Infer association klass as top level if model has same demodularized name by joshuay03 · Pull Request #51721 · rails/rails

これはRails 7.2で反映済みです。

名前空間ありのモデルに関連付けられる、名前空間のない同じ名前のモデル名を正しく推論できるよう修正。

以下のセットアップ例で考える。

class Nested::Post < ApplicationRecord
  has_one :post, through: :other
end

修正前は、この#postNested::Postと推論されてしまっていたが、修正後は正しくPostと推論されるようになった。

Joshua Young
同Changelogより

🔗 Make public method for schema_cache_ignored_tables? by eileencodes · Pull Request #51878 · rails/rails

参考: 週刊Railsウォッチ20240619: schema_cache_ignored_tables?のpublicメソッドを追加

テーブルがスキーマキャッシュで無視されるかどうかをチェックするpublicメソッドを追加。

従来は、テーブルが無視される設定になっているかどうかをチェックするために、アプリケーションでスキーマキャッシュクラスのignored_table?を再実装しなければならなかった。

これをサポートするpublicメソッドが追加され、スキーマキャッシュはこれを直接利用するよう更新された。

ActiveRecord.schema_cache_ignored_tables = ["developers"]
ActiveRecord.schema_cache_ignored_table?("developers")
#=> true

Eileen M. Uchitelle
同Changelogより

🔗 Railties(26件)

Rails 8.0.0.rc2 (October 30, 2024)

🔗 Fix incorrect database.yml with skip_solid by JoeDupuis · Pull Request #53488 · rails/rails

アプリのジェネレータからdevcontainerジェネレータを呼び出すとdatabase.ymlにskip_solidが含まれていないバグを修正。

Joé Dupuis
同Changelogより

🔗 Default Regexp.timeout to 1s by rafaelfranca · Pull Request #53490 · rails/rails

ReDoS(正規表現サービス拒否)攻撃に対するセキュリティ改善のため、Regexp.timeoutコンフィグがデフォルトで1秒に設定された。

Rafael Mendonça França
同Changelogより

Rails 8.0.0.rc1 (October 19, 2024)

🔗 非推奨項目を削除

(以下のリンク先は非推奨化時のプルリク情報)

Rafael Mendonça França

🔗 Add support for using Kamal inside of the generated devcontainer by JoeDupuis · Pull Request #53327 · rails/rails

参考: 週刊Railsウォッチ20241108: Rails公式のdevcontainer内でもKamalをサポート

devcontainerにKamalのサポートを追加

従来は、生成したdevcontainerでDockerを利用できなかったため、Kamalを利用できなかった。

Joé Dupuis
同Changelogより

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Set error code to 1 if generator could not be found by coezbek · Pull Request #53028 · rails/rails

rails gでジェネレータが見つからなかった場合にコード1で終了するようになった。

従来のrails gは0を返していたため、rails gのスクリプトにタイポがあった場合に気づきにくかった。

Christopher Özbek
同Changelogより

🔗 Remove require_* statements from application.css by jeduardo824 · Pull Request #53021 · rails/rails

SprocketsからPropshaftへの移行に伴い、application.cssファイルからrequire_*ステートメントを削除した。

Rails 8からはPropshaftがデフォルトのアセット パイプラインになった。application.cssの require_tree句やrequire_self句は Sprockets に固有のものであったため、不要となった。また、ファイルのコメントも更新され、CSSの優先順位がアセットパイプラインによる自動優先順位付けなしで標準のカスケード順序に従うようになったことが明確になった。

Eduardo Alencar
同Changelogより

Propshaft gem README(翻訳)

🔗 Do not include redis by default in dev container by andrewn617 · Pull Request #52934 · rails/rails

devcontainerにデフォルトでRedisを含めないように変更。

アプリケーションではデフォルトでSolid Queue gemとSolid Cache gemが使われるようになったため、Dev Containerにredisを含める必要がなくなった。Active JobやAction Cableを使うアプリを生成するときに--skip-solid を指定した場合にのみ、Redisを含める。

既存のアプリ用にDev Containerを生成する場合、solid * gemのどれかを使うようになっていればRedisを含めない。

Andrew Novoselac
同Changelogより

🔗 Add Solid Cable by dhh · Pull Request #52889 · rails/rails

Solid Cableをproduction環境におけるデフォルトのAction Cableアダプタとして利用し、config/database.ymlで別のキューデータベースとして設定するようになった。

Solid Cableは、メッセージをDBテーブルに保持して更新を継続的にポーリングする。これにより、他の目的で必要でなければRedisへの一般的な依存関係を削除できるようになる。ポーリング方式であるにもかかわらず、Solid Cableのパフォーマンスはほとんどの状況でRedisに匹敵する。また、Redisがすべての状況でAction Cable 機能に必要な依存関係ではなくなればRailsをデプロイしやすくなる。

DHH
同Changelogより

Solid Cable README: DBベースのAction Cableアダプタ(翻訳)

🔗 Add Solid Queue alongside Solid Cache by dhh · Pull Request #52804 · rails/rails

Solid Queueをproduction環境におけるデフォルトのActive Jobバックエンドとして利用し、config/database.ymlで別のキューデータベースとして設定するようになった。単一サーバーのデプロイメントでは、Solid QueueはPumaプラグインとして実行される。これはconfig/deploy.ymlで設定可能で、ジョブ専用のマシンを使う形への変更も簡単である。

DHH
同Changelogより

Solid Queue README -- DBベースのActive Jobバックエンド(翻訳)

🔗 Add Solid Cache (and get ready for Solid Queue) by dhh · Pull Request #52790 · rails/rails

Solid Cacheをproduction環境におけるデフォルトのRails.cacheバックエンドとして利用し、config/database.ymlで個別のキャッシュ データベースとして設定するようになった。

DHH
同Changelogより

Solid Cache README: DBベースのキャッシュストア(翻訳)

🔗 Silence healthcheck requests from the log by dhh · Pull Request #52789 · rails/rails

Rails::Rack::SilenceRequestが追加された。config.silence_healthcheck_path = パスを設定することで"/up"パスへのリクエストを抑制する。これで、Kamalで必要なヘルスチェックによってproduction環境のログが詰まるのを防ぐ。

DHH
同Changelogより

🔗 Add mariadb options to application generator by andrewn617 · Pull Request #52266 · rails/rails

rails newのデータベースオプションにmariadb-mysqlmariadb-trilogyも追加された。

これらのオプションを--devcontainerフラグと併用することで、mariadbをDev Containerのデータベースとして使うようになる。元のmysqltrilogyオプションを指定した場合はmysqlを使うようになる。Dev Containerを生成しないユーザーは、この新しいオプションを使う必要はない。

Andrew Novoselac
同Changelogより

🔗 Fix third party hook for rails stats Thor command by p8 · Pull Request #52226 · rails/rails

::STATS_DIRECTORIESを非推奨化。

グローバル定数STATS_DIRECTORIESが非推奨化された。今後は Rails::CodeStatistics.register_directoryを使うこと。

Rails::CodeStatistics.register_directory(label, path)を使ってディレクトリを追加できる。

require "rails/code_statistics"
Rails::CodeStatistics.register_directory('My Directory', 'path/to/dir')

Petrik de Heus
同Changelogより

🔗 Enable query log tags by default on development env by MatheusRich · Pull Request #51342 · rails/rails

development環境でクエリログのタグをデフォルトで有効にするようになった。

これは、問題のあるSQLステートメントを、そのステートメントを生成したアプリケーションコードまでさかのぼってトラッキングするのに有用。また、どのデータベースが使われているかもクエリログで特定できるため、マルチプルデータベースでも有用。

Matheus Richard
同Changelogより

🔗 Defer route drawing to the first request, or when url_helpers called by gmcgibbon · Pull Request #52353 · rails/rails

ルーティングのレンダリングを最初のリクエストまで、またはurl_helpersが呼び出されるまで先延ばし(defer)する。

ミドルウェアで最初のルーティングの再読み込みを実行するか、ルーティングセットのurl_helpersがルーティング呼び出しを受け取ったときやルーティングに応答するかどうかを尋ねられたときにレンダリングを実行する。

従来のルーティングのレンダリングは起動時に無条件に実行されていたが、ルーティングが多数ある大規模アプリでは起動時間が不必要に遅くなる可能性がある。

config.eager_load = trueを指定した環境(production環境など)では、従来通り起動時にルーティングがeager loadingされる。

Gannon McGibbon
同Changelogより

🔗 Rename text_area to textarea and rich_text_area to rich_textarea by seanpdoyle · Pull Request #52467 · rails/rails

ヘルパーで生成されるtext_area*メソッド名がtextarea*に変更された。

Sean Doyle
同Changelogより

🔗 Add basic sessions generator by dhh · Pull Request #52328 · rails/rails

authenticationジェネレーターを追加して、データベースでトラッキングされるセッションやパスワードのリセットを利用する基本的な認証システムを生成してカスタマイズできるようになった。

bin/rails generate authentication

上のコマンドで以下のファイルが生成される。

app/models/current.rb
app/models/user.rb
app/models/session.rb
app/controllers/sessions_controller.rb
app/controllers/passwords_controller.rb
app/mailers/passwords_mailer.rb
app/views/sessions/new.html.erb
app/views/passwords/new.html.erb
app/views/passwords/edit.html.erb
app/views/passwords_mailer/reset.html.erb
app/views/passwords_mailer/reset.text.erb
db/migrate/xxxxxxx_create_users.rb
db/migrate/xxxxxxx_create_sessions.rb
test/mailers/previews/passwords_mailer_preview.rb

DHH
同Changelogより

Rails 8で基本的な認証ジェネレータが導入される(翻訳)

🔗 Add not-null modifier to migrations by dhh · Pull Request #52327 · rails/rails

参考: 週刊Railsウォッチ20240808: マイグレーション生成オプションにnot-nullを生成する!演算子が追加

マイグレーションの属性に、not-nullを指定する!演算子が追加された。

bin/rails generate migration CreateUsers email_address:string!:uniq password_digest:string!

上のコマンドで以下が生成される。

class CreateUsers < ActiveRecord::Migration[8.0]
  def change
    create_table :users do |t|
      t.string :email_address, null: false
      t.string :password_digest, null: false

      t.timestamps
    end
    add_index :users, :email_address, unique: true
  end
end

DHH
同Changelogより

🔗 Add script folder and generator by jeromedalbert · Pull Request #52335 · rails/rails

参考: 週刊Railsウォッチ20240807: ジェネレータ関連2件

アプリケーションに標準のscriptフォルダとスクリプトジェネレータが追加された。

scriptフォルダは、使い捨てのスクリプトや汎用のスクリプト(データマイグレーションやクリーンアップ用のスクリプトなど)を置くためのもの。

新しいスクリプトジェネレータを使うと、以下のようにスクリプトを作成できる。

bin/rails generate script my_script
bin/rails generate script data/backfill

生成したスクリプトは以下のように実行できる。

bundle exec ruby script/my_script.rb
bundle exec ruby script/data/backfill.rb

Jerome Dalbert, Haroon Ahmed
同Changelogより

🔗 Add bin/rake stats deprecation changelog by JuanVqz · Pull Request #52231 · rails/rails

bin/rake statsが非推奨化された。今後はbin/rails statsを使うこと。

Juan Vásquez
同Changelogより

🔗 Add an internal route for bin/rails notes by deepakmahakale · Pull Request #49240 · rails/rails

内部向けの/rails/info/notesページにアクセスすることで、bin/rails notesと同じ情報をブラウザで表示できるようになった。

Deepak Mahakale
同Changelogより

参考: 2.10 bin/rails notes -- コマンドラインツール - Railsガイド

🔗 Add rubocop and GitHub Actions to plugin generator by excid3 · Pull Request #51822 · rails/rails

これはRails 7.2で反映済みです。

RubocopとGitHub Actionsをプラグインジェネレータに追加した。
--skip-rubocop--skip-ciを指定することでスキップ可能。

Chris Oliver
同Changelogより

🔗 Add Kamal by default to Rails 8 by dhh · Pull Request #51798 · rails/rails

参考: 週刊Railsウォッチ20240529: Rails 8からKamalがデフォルトのデプロイツールになる

デフォルトでKamalをデプロイに使うようになった。Rails固有のconfig/deploy.ymlも生成されるようになる。

--skip-kamalを指定することでスキップ可能。詳しくはhttps://kamal-deploy.org/を参照。

DHH
同Changelogより

Kamal README: 37signalsの多機能コンテナデプロイツール(翻訳)

🔗 Action Pack(21件)

Rails 8.0.0.rc2 (October 30, 2024)

🔗 Fix routes with :: in the path by rafaelfranca · Pull Request #53453 · rails/rails

ルーティングのパスに::があるとパーサーが正常に動かなくなる問題を修正。

Rafael Mendonça França
同Changelogより

🔗 Maintain Rack 2 parameter parsing behaviour by matthewd · Pull Request #53471 · rails/rails

互換性のためRack 2のパラメータ解析の振る舞いを維持するようにした。

Matthew Draper
同Changelogより

Rails 8.0.0.rc1 (October 19, 2024)

🔗 Make behaviour of has_value?/value? more consistent by stefkin · Pull Request #44866 · rails/rails

非推奨化されていたallow_deprecated_parameters_hash_equalityを削除。

Rafael Mendonça França
同Changelogより

🔗 Improve ActionController::TestCase to expose a binary encoded request.body. by casperisfine · Pull Request #53298 · rails/rails

ActionController::TestCaseがバイナリエンコードされたrequest.bodyを公開するよう改善。

Rackの仕様書には以下のように明確に記載されている。

入力ストリームは、生のHTTP POSTデータを含むIO的なオブジェクトである。
該当する場合、外部エンコードは「ASCII-8BIT」で、バイナリ モードで開く必要がある。

これまで一般的にUTF-8がエンコーディングとして使われていたが、これはproductionの振る舞いを正確に反映していなかった。

Jean Boussier
同Changelogより

🔗 AllowBrowser: support method names for :block by seanpdoyle · Pull Request #53158 · rails/rails

ActionController::AllowBrowserが更新されて:blockオプションにメソッド名を渡せるようになった。

class ApplicationController < ActionController::Base
  allow_browser versions: :modern, block: :handle_outdated_browser

  private
    def handle_outdated_browser
      render file: Rails.root.join("public/custom-error.html"), status: :not_acceptable
    end
end

Sean Doyle
同Changelogより

🔗 [Fix #51463] Raise an error when invalid :only or :except options are given to #resource or #resources by joshuay03 · Pull Request #51464 · rails/rails

ルーティングの#resource#resourcesに無効な:onlyオプションや:exceptオプションを渡した場合にArgumentErrorをraiseするようになった。

Joshua Young
同Changelogより

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Reapply "Merge pull request #27586 from maclover7/jm-fix-27584" by skipkayhil · Pull Request #52348 · rails/rails

ActionController::TestCaseで非GETリクエストがcookieを更新しないバグを修正。

Jon Moss, Hartley McGuire
同Changelogより

🔗 Use thread pool for ActionController::Live by tgwizard · Pull Request #52731 · rails/rails

ActionController::Liveがスレッドプールを用いてリクエスト間でスレッドを再利用するよう更新。

Adam Renberg Tamm
同Changelogより

🔗 Add Parameters#expect to safely filter and require params by martinemde · Pull Request #51674 · rails/rails

従来よりも安全で明示的なパラメータ処理方法であるparams#expectを導入する。

従来のparams.require(:table).permit(:attr)という書き方をparams.expect(table: [ :attr ])に置き換える。

パラメータのフィルタリングで、期待される値の型を考慮するようにし、パラメータの処理を改善し、パラメータ改ざんで本来なら無視できるエラーが発生するのを回避する。

# URLが?person=hackedに改ざんされた場合の振る舞い
# 改修前
params.require(:person).permit(:name, :age, pets: [:name])
# raises NoMethodError, causing a 500 and potential error reporting

# 改修後
params.expect(person: [ :name, :age, pets: [[:name]] ])
# raises ActionController::ParameterMissing, correctly returning a 400 error

上では新しい二重配列構文[[:name]]が使われていることもわかる。パラメータで期待される値が「パラメータハッシュの配列」である場合、この二重配列構文を用いて明示的に配列を宣言できるようになる。

逆に言えば、expectで配列が期待される場合は二重配列構文で宣言しなければならない。たとえばpet: [:name]が宣言されているときに配列を渡しても無視される。

互換性維持のため、Rails 8のpermitでは新しい二重配列構文を採用していないが、permitは予期しない型を渡されたときの振る舞いをexpectほど厳密にできない。このため、常にexpectを使うことが推奨される。

従来のparams.require(:person).permit(:name, :age)という書き方は外部ユーザーがパラメータを改ざんして簡単に500エラーをトリガーできてしまう。これを防ぐには、params.expect(person: [:name, :age])という書き方(public/400.htmlで400 エラーを返す)に置き換えることが推奨される。

同様に、従来のparams.require(:id)という書き方もparams.expect(:id)という書き方に置き換えるべき。後者の書き方は、「params[:id] が(配列でもハッシュでもなく)スカラーであること」を保証するように設計されており、さらに従来同様:idパラメータが省略不可であることも指定される。

# 改修前
# 配列も渡せてしまうため振る舞いを改変される
User.find(params.require(:id))

# 改修後
# 空欄でない許可済みスカラー値だけを返すことが期待される
# (つまりHashでもArrayでもnilでも""などでもない値)
User.find(params.expect(:id))

Martin Emde
同Changelogより

以下の元記事はMartin Emdeさん自身によるものです↓。

Rails 8: strong parametersの新しいparams.expectの使い方(翻訳)

🔗 system testing: disable chrome's search engine choice modal by glaszig · Pull Request #52805 · rails/rails

システムテストで、Chromeを初めて起動したときに表示される「検索エンジンを選択してください」ページをデフォルトで無効にするよう修正。

glaszig
同Changelogより

🔗 Fix raw_post raising when rack.input is nil by skipkayhil · Pull Request #52138 · rails/rails

rack.inputnilの場合にRequest#raw_postNoMethodErrorが発生する問題を修正。

Hartley McGuire
同Changelogより

🔗 Remove racc by gmcgibbon · Pull Request #52610 · rails/rails

ActionDispatch::Journey::Scannerを手書きする形でraccへの依存を削除した。

Gannon McGibbon
同Changelogより

🔗 Make route mapping scope lookups faster by gmcgibbon · Pull Request #52525 · rails/rails

ActionDispatch::Routing::Mapper::Scope#[]を、フレームのハッシュをmergeすることで高速化した。

Gannon McGibbon
同Changelogより

🔗 Let allow_browser allow bots by n-studio · Pull Request #52531 · rails/rails

これはRails 7.2で反映済みです。

user-agentがボットの場合にallow_browserを無視できるよう修正

Matthew Nguyen
同Changelogより

🔗 Deprecate multiple path route mapping by gmcgibbon · Pull Request #52409 · rails/rails

参考: 週刊Railsウォッチ20240819: ルーティングの非推奨化2件

ルーティング高速化のため、複数パスを含むルーティング生成を非推奨化する
複数パスは、with_optionsまたはループを使えば楽に生成できる。

# 変更前
get "/users", "/other_path", to: "users#index"

# 変更後
get "/users", to: "users#index"
get "/other_path", to: "users#index"

Gannon McGibbon
同Changelogより

🔗 Make http_cache_forever use immutable: true by natematykiewicz · Pull Request #52283 · rails/rails

参考: 週刊Railsウォッチ20240807: http_cache_foreverをデフォルトでimmutable: trueに設定

http_cache_foreverimmutable: trueになるよう修正した。

Nate Matykiewicz
同Changelogより

🔗 Prefer ETag over Last-Modified for fresh_when and stale? according to the HTTP specification by casperisfine · Pull Request #52274 · rails/rails

参考: 週刊Railsウォッチ20240807: ETagLast-Modifiedが両方存在する場合はETagを優先するよう修正
参考: 3.11 config.action_dispatch.strict_freshness -- Rails アプリケーションの設定項目 - Railsガイド

config.action_dispatch.strict_freshnessを追加。

このコンフィグをtrueに設定すると、RFC 7232 Section 6での指定に沿って、ETagLast-Modifiedが両方存在する場合はETagを優先するようになる。

従来のRailsバージョンとの互換性を維持するため、デフォルトではfalseに設定されているが、Rails 8.0からはデフォルトでtrueになる。

heka1024
同Changelogより

🔗 Support immutable directive in Cache-Control by heka1024 · Pull Request #52197 · rails/rails

参考: 週刊Railsウォッチ20240709: キャッシュコントロールのimmutableをサポート

Cache-Controlでimmutableディレクティブをサポート

expires_in 1.minute, public: true, immutable: true
# Cache-Control: public, max-age=60, immutable

heka1024
同Changelogより

🔗 Add CSP mapping for 'wasm-unsafe-eval' by jrmhaig · Pull Request #51934 · rails/rails

参考: 週刊Railsウォッチ20240620: CSPのwasm-unsafe-evalでWasmモジュールの読み取り・実行を許可

content_security_policy:wasm_unsafe_evalのマッピングを追加。

# 改修前
policy.script_src "'wasm-unsafe-eval'"

# 改修後
policy.script_src :wasm_unsafe_eval

Joe Haig
同Changelogより

参考: wasm-unsafe-eval -- Content-Security-Policy - HTTP | MDN

🔗 Update permissions policy list with display-capture and keyboard-map by cbldev · Pull Request #51944 · rails/rails

参考: 週刊Railsウォッチ20240619: PermissionsPolicyにdisplay-capturekeyboard-mapを追加
参考: Permissions Policy - HTTP | MDN

permissions_policydisplay-capturekeyboard-mapを追加。

Cyril Blaecke
同Changelogより

🔗 Add route helper for websockets. by ioquatix · Pull Request #52169 · rails/rails

ルーティングのWebSockets用connectヘルパーを追加。

Samuel Williams
同Changelogより

🔗 Active Support(20件)

Rails 8.0.0.rc1 (October 19, 2024)

🔗 非推奨項目を削除

(以下のリンク先は非推奨化時のプルリク情報)

Rafael Mendonça França

🔗 Don't execute i18n watcher on boot. by gmcgibbon · Pull Request #53259 · rails/rails

起動時にi18nウォッチャーを実行しないよう修正。起動の初期はファイルの変更をキャッチできないため、訳文の多いアプリケーションの起動が不必要に遅くなる。

Gannon McGibbon, David Stosik
同Changelogより

🔗 Fix ActiveSupport::HashWithIndifferentAccess#stringify_keys to stringify all keys not just symbols. by byroot · Pull Request #53125 · rails/rails

ActiveSupport::HashWithIndifferentAccess#stringify_keysがすべてのキーを(シンボルではなく)文字列化するよう修正。

修正前:

{ 1 => 2 }.with_indifferent_access.stringify_keys[1] # => 2

修正後:

{ 1 => 2 }.with_indifferent_access.stringify_keys["1"] # => 2

この変更はバグ修正と見なすことも可能だが、このように振る舞っていた期間が非常に長かったため、修正をバックポートせず、メジャー リリースで変更を行うことにした。

Jean Boussier
同Changelogより

# 参考: Rails 7.2.2
{ 1 => 2 }.with_indifferent_access
#=> {1=>2}
{ 1 => 2 }.with_indifferent_access.stringify_keys[1]
#=> 2
» { 1 => 2 }.with_indifferent_access.stringify_keys["1"]
#=> nil

# Rails 8
{ 1 => 2 }.with_indifferent_access
#=> {1=>2}
{ 1 => 2 }.with_indifferent_access.stringify_keys[1]
#=> nil
{ 1 => 2 }.with_indifferent_access.stringify_keys["1"]
#=> 2

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Include options when instrumenting ActiveSupport::Cache::Store delete by tgwizard · Pull Request #52912 · rails/rails

ActiveSupport::Cache::Store#deleteActiveSupport::Cache::Store#delete_multiのinstrumentationにオプションも渡せるようになった。

Adam Renberg Tamm
同Changelogより

🔗 Call prerecord to fix verbose test runs under parallelization by jhawthorn · Pull Request #52917 · rails/rails

パラレルテストでrails test -vを実行したときにテスト名を表示するよう修正。

John Hawthorn, Abeid Ahmed
同Changelogより

🔗 Deprecate Benchmark.ms and add benchmark to the gemspec by Earlopain · Pull Request #52746 · rails/rails

Active Supportコア拡張のBenchmark.msを非推奨化。

Ruby 3.5からはbenchmark gemがバンドルされるようになる。

Earlopain
同Changelogより

ruby/benchmark - GitHub

🔗 Update TimeWithZone#inspect to match Ruby 1.9+ ISO 8601 format by jhawthorn · Pull Request #52371 · rails/rails

ActiveSupport::TimeWithZone#inspectを、Ruby 1.9以降のTime#inspectと同様にISO 8601スタイル(曜日を表示しない)で表示するよう修正。

John Hawthorn
同Changelogより

参考: ISO 8601 - Wikipedia
参考: Rails API inspect -- ActiveSupport::TimeWithZone

🔗 ActiveSupport::ErrorReporter#report assigns a backtrace to unraised exceptions by casperisfine · Pull Request #52684 · rails/rails

ActiveSupport::ErrorReporter#reportが、raiseされていない例外にバックトレースを割り当てるようになった。

従来は、raiseされていない例外を報告すると、生成されるエラーレポートにバックトレースが含まれなかった。改修後は自動的にバックトレースが生成されるようになった。

Jean Boussier
同Changelogより

🔗 Add escape_html_entities option to JSON encoder by Resonious · Pull Request #51272 · rails/rails

ActiveSupport::JSON.encodeescape_html_entitiesオプションが追加された。

これにより、特定のto_json呼び出しに対してActiveSupport.escape_html_entities_in_jsonのグローバル設定を上書きできるようになった。

このオプションは、コントローラで以下のように使える。

class MyController < ApplicationController
  def index
    render json: { hello: "world" }, escape_html_entities: false
  end
end

Nigel Baillie
同Changelogより

参考: 3.14.3 config.active_support.escape_html_entities_in_json --
Rails アプリケーションの設定項目 - Railsガイド

🔗 Raise when using key which can't respond to #to_sym in EncryptedConfiguration by zzak · Pull Request #51950 · rails/rails

EncryptedConfiguration#to_symに応答できないキーを使うとraiseするようになった。

サポートされていないIntegerやFloatをキーとして使おうとした場合も同様。

zzak
同Changelogより

🔗 Combined time addition deprecation by jhawthorn · Pull Request #52370 · rails/rails

TimeActiveSupport::TimeWithZone同士で加算(+)やsinceを使うことが非推奨化された。

従来は、10.days.ago + 10.days.agoのようなタイムインスタンス同士の加算や10.days.ago.since(10.days.ago)を実行すると、無意味な未来の日付が生成された。この振る舞いは非推奨化され、Rails 8.1で削除される。

Nick Schwaderer
同Changelogより

🔗 Support rfc2822 format for Time#to_fs & Date#to_fs by the-spectator · Pull Request #52337 · rails/rails

Time#to_fsDate#to_fsでrfc2822フォーマットを追加(訳注: rfc822と同じフォーマットです)。

Akshay Birajdar
同Changelogより

参考: RFC822メッセージ形式 (Gauche ユーザリファレンス)
参考: RFC 2822 - Internet Message Format 日本語訳
参考: RFC 5322 - Internet Message Format 日本語訳 -- 現在はこちらのRFCが有効です

🔗 [i18n] - Do not watch translations from gems when reloading is enabled by Schwad · Pull Request #52271 · rails/rails

参考: 週刊Railsウォッチ20240807: ファイルウォッチャーでi18nの読み込みパスを削減して最適化

Railtie#initialize_i18nの読み込み時間を最適化した。
ファイルウォッチャーに渡されるI18n.load_pathRails.rootの下にあるものだけにフィルタする。従来のウォッチャーは、変更が発生しないためウォッチャーの不要なgem内のロケールも含め、利用可能なすべてのロケールを取得していた。

Nick Schwaderer
同Changelogより

🔗 [ActiveSupport] Add option filter on in_order_of by igordepolli · Pull Request #52072 · rails/rails

in_order_offilterオプションを追加した。
filter: falseを指定すると、並べ替えの結果をこれらの値でフィルタリングせずに特定の値を優先するようになる。

Igor Depolli
同Changelogより

🔗 Improve error message when passing a proc to assert_difference or assert_changes by richardboehme · Pull Request #52036 · rails/rails

(MRIのみ)assert_differenceassert_changesにprocを渡したときのエラーメッセージにprocのパスではなくソースコードを出力するよう改善した。

Richard Böhme, Jean Boussier
同Changelogより

# 同PRより
test "see proc output" do
  assert_difference -> { 1 } do
  end
end
# 改修前
#<Proc:0x000074357846eae8 /home/richard/my-test-app/test/models/test.rb:21 (lambda)> didn't change by 1, but by 0.
Expected: 2
  Actual: 1
# 改修後
"-> { 1 }" didn't change by 1, but by 0.
Expected: 2
  Actual: 1

🔗 Add a config for preserving timezone information when calling to_time on TimeWithZone object by jasonkim · Pull Request #52091 · rails/rails

ActiveSupport.to_time_preserves_timezoneに新しい設定値:zoneを追加し、従来のtrue値を:offsetという名前に変更した(新しいデフォルト値は:zone)。

Jason Kim, John Hawthorn
同Changelogより

参考: 3.14.18 config.active_support.to_time_preserves_timezone
-- Rails アプリケーションの設定項目 - Railsガイド

🔗 Instrument ActiveSupport::Cache::MemoryStore#increment and #decrement by frederikspang · Pull Request #52723 · rails/rails

ActiveSupport::Cacheのinstrumentation payload[:key]を、名前空間化および正規化されたキーでも同じパターンに沿うように調整した。

Frederik Erbs Spang Thomsen
同Changelogより

🔗 Set usec 0 unless with_usec by mopp · Pull Request #52880 · rails/rails

with_usec: falseを指定して渡された引数がStringまたはDateTimeの場合はusec(マイクロ秒)を0に設定するようtravel_toを修正。

mopp
同Changelogより

🔗 Active Model(6件)

Rails 8.0.0.rc1 (October 19, 2024)

🔗 Add :except_on option for validations by DRBragg · Pull Request #43495 · rails/rails

バリデーションに:except_onオプションが追加された。
これを使うことで、特定のコンテキストでバリデーションをスキップできるようになる。

class User < ApplicationRecord
    #...
    validates :birthday, presence: { except_on: :admin }
    #...
end

user = User.new(attributes except birthday)
user.save(context: :admin)

Drew Bragg
同Changelogより

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Make ActiveModel::Serialization#read_attribute_for_serialization public by seanpdoyle · Pull Request #53042 · rails/rails

ActiveModel::Serialization#read_attribute_for_serializationメソッドをpublicにした。

Sean Doyle
同Changelogより

参考: Rails API ActiveModel::Serialization

🔗 Add a default password reset token to has_secure_password by dhh · Pull Request #52483 · rails/rails

has_secure_passwordで利用できる、パスワードリセットトークン用のデフォルトのトークンジェネレーターを追加した。

class User < ApplicationRecord
  has_secure_password
end

user = User.create!(name: "david", password: "123", password_confirmation: "123")
token = user.password_reset_token
User.find_by_password_reset_token(token) # returns user

# 16分後...
User.find_by_password_reset_token(token) # returns nil

# トークンが失効しているのでActiveSupport::MessageVerifier::InvalidSignatureになる
User.find_by_password_reset_token!(token)

DHH
同Changelogより

Rails 8で基本的な認証ジェネレータが導入される(翻訳)

🔗 Change ActiveModel human_attribute_name to raise an error by shouichi · Pull Request #52426 · rails/rails

参考: 週刊Railsウォッチ20240819: モデルでhuman_attribute_nameの訳文が見つからない場合にエラーを発生するよう改修

ActiveModel::Translation用の読み込みフックactive_model_translationを追加。

Shouichi Kamiya
同Changelogより

ActiveModel::Translationraise_on_missing_translationsオプションを追加。

このオプションを設定すると、指定の属性の訳文が見つからない場合にhuman_attribute_nameがエラーを発生するようになる。

# ActiveModel::Translation.raise_on_missing_translations = false
Post.human_attribute_name("title")
#=> "Title"

# ActiveModel::Translation.raise_on_missing_translations = true
Post.human_attribute_name("title")
#=> Translation missing. Options considered were: (I18n::MissingTranslationData)
    - en.activerecord.attributes.post.title
    - en.attributes.title

            raise exception.respond_to?(:to_exception) ? exception.to_exception : exception
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Shouichi Kamiya
同Changelogより

参考: 3.6.5 config.i18n.raise_on_missing_translations -- Rails アプリケーションの設定項目 - Railsガイド

🔗 Introduce ActiveModel::AttributeAssignment#attribute_writer_missing by seanpdoyle · Pull Request #52417 · rails/rails

参考: 週刊Railsウォッチ20240819: attribute_writer_missingが追加

ActiveModel::AttributeAssignment#attribute_writer_missingが追加された。

見つからない属性の代入を適切に行える機会をインスタンスに提供する。

class Rectangle
  include ActiveModel::AttributeAssignment

  attr_accessor :length, :width

  def attribute_writer_missing(name, value)
    Rails.logger.warn "Tried to assign to unknown attribute #{name}"
  end
end

rectangle = Rectangle.new
rectangle.assign_attributes(height: 10) # => Logs "Tried to assign to unknown attribute 'height'"

Sean Doyle
同Changelogより

参考: Rails API attribute_writer_missing -- ActiveModel::AttributeAssignment

🔗 Action View(5件)

Rails 8.0.0.rc1 (October 19, 2024)

🔗 非推奨項目を削除

(以下のリンク先は非推奨化時のプルリク情報)

Rafael Mendonça França

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Enable DependencyTracker to evaluate interpolated paths by skipkayhil · Pull Request #50944 · rails/rails

renderの末尾に式展開(interpolation)が使われている場合のDependencyTrackerを有効にした。

<%= render "maintenance_tasks/runs/info/#{run.status}" %>

従来のDependencyTrackerはこのレンダリングを無視していたが、修正後は"maintenance_tasks/runs/info"フォルダー内のすべてのパーシャルを依存関係としてマーキングするようになった。

Hartley McGuire
同Changelogより

🔗 Rename text_area to textarea and rich_text_area to rich_textarea by seanpdoyle · Pull Request #52467 · rails/rails

text_areaメソッドをtextareaにリネーム。

変更前の名前もエイリアスとして利用可能。

Sean Doyle*
同Changelogより

🔗

参考: 週刊Railsウォッチ20240819: check_boxcheckboxにリネーム

check_box*メソッドをcheckbox*にリネーム。

変更前の名前もエイリアスとして利用可能。

Jean Boussier
同Changelogより

🔗 Action Text(5件)

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Dispatch direct-upload events on attachment uploads by MatheusRich · Pull Request #52680 · rails/rails

添付ファイルのアップロード時にダイレクトアップロードのイベントをディスパッチするようになった。

Action Textのリッチなtextareaを使うと、ファイルをエディタに添付可能になる。従来のアクションはイベントをディスパッチしなかったため、ファイルのアップロードに対応するのが面倒だった。たとえば、アップロードが失敗した場合に、ユーザーに通知したりエディタから添付ファイルを削除したりする方法がなかった。

このコミットにより、Active Storageのダイレクトアップロードの振る舞いと同様に、direct-upload:startdirect-upload:progress、およびdirect-upload:endという新しいイベントが追加される。

Matheus Richard, Brad Rees
同Changelogより

参考: 6.1.1 添付ファイルのダイレクトアップロード用JavaScriptイベント -- Action Text の概要 - Railsガイド

🔗 Add store_if_blank option to has_rich_text by ghiculescu · Pull Request #52573 · rails/rails

has_rich_textstore_if_blankオプションを追加。

store_if_blank: falseを指定すると、保存時に属性が空の場合(フォームのオプショナルパラメータから受け取った属性など)はActionText::RichText を作成しないようになる。

class Message
  has_rich_text :content, store_if_blank: false
end

Message.create(content: "hi") # ActionText::RichTextを作成する
Message.create(content: "") # ActionText::RichTextを作成しない

Alex Ghiculescu
同Changelogより

🔗 ActionText::Content - Strip content attribute if it is empty by jagthedrummer · Pull Request #52281 · rails/rails

キーが存在していても値が空の場合は添付ファイルのcontent属性をレンダリングしないよう修正。

Jeremy Green
同Changelogより

🔗 Rename text_area to textarea and rich_text_area to rich_textarea by seanpdoyle · Pull Request #52467 · rails/rails

rich_text_areaメソッドをrich_textareaにリネーム。

変更前の名前もエイリアスとして利用可能。

Sean Doyle*
同Changelogより

🔗 Only sanitize content attribute when present in attachments by p8 · Pull Request #52093 · rails/rails

これはRails 7.2で反映済みです。

content属性のサニタイズはcontent属性が添付ファイルに存在する場合にのみ行うよう最適化。

Petrik de Heus
同Changelogより

🔗 Active Storage(4件)

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Deprecate ActiveStorage::Service::AzureStorageService by zzak · Pull Request #52863 · rails/rails

ActiveStorage::Service::AzureStorageServiceを非推奨化。

zzak
同Changelogより

🔗 Added new unsafe characters of Windows filename ", <, >, ?, * to ActiveStorage::Filename#sanitized by martin-mfv · Pull Request #52496 · rails/rails

ActiveStorage::Filename#sanitizedメソッドによる特殊文字の処理効率を改善。
ファイル名に"*?<>文字が存在する場合は、Windows OSのファイル名規則に合わせて-に置き換える。

Luong Viet Dung(Martin)
同Changelogより

🔗 Improve ActiveStorage::InvariableError message by p8 · Pull Request #52193 · rails/rails

InvariableErrorUnpreviewableErrorUnrepresentableErrorのメッセージを改善。

メッセージにblob idとcontent_typeも含まれるようになった。

Petrik de Heus
同Changelogより

🔗 Make http_cache_forever use immutable: true by natematykiewicz · Pull Request #52283 · rails/rails

参考: 週刊Railsウォッチ20240807: http_cache_foreverをデフォルトでimmutable: trueに設定

http_cache_foreverimmutable: trueになるよう修正した。

Nate Matykiewicz
同Changelogより

🔗 Active Job(3件)

Rails 8.0.0.rc1 (October 19, 2024)

🔗 Remove deprecations part 1 by rafaelfranca · Pull Request #50144 · rails/rails

非推奨化されていたconfig.active_job.use_big_decimal_serializerを削除。

Rafael Mendonça França
同Changelogより

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Turn SuckerPunch removal into deprecation and point to async adapter by zzak · Pull Request #52990 · rails/rails

アダプタオプションとしてのsucker_punchを非推奨化。

このアダプタを使っている場合は、 adapter: asyncに変更することで同じ機能を得られる。

Dino Maric, zzak
同Changelogより

brandonhilkert/sucker_punch - GitHub

🔗 Use RAILS_MAX_THREADS in ActiveJob::AsyncAdapter by heka1024 · Pull Request #52468 · rails/rails

ActiveJob::AsyncAdapterRAILS_MAX_THREADS環境変数の値を使うようになった。この環境変数が未設定の場合はデフォルトとして5が使われる。

heka1024
同Changelogより

参考: 3.1 Puma -- デプロイ用パフォーマンスチューニング - Railsガイド

🔗 Action Cable(1件)

Rails 8.0.0.beta1 (September 26, 2024)

🔗 Include identifier in ActionCable channel notifications by krschacht · Pull Request #52421 · rails/rails

ActiveSupport::Notificationtransmit_subscription_confirmation.action_cabletransmit_subscription_rejection.action_cableのイベントペイロードとしてidentifierが追加された。

Keith Schacht
同Changelogより

参考: 3.10.3 transmit_subscription_confirmation.action_cable -- Active Support Instrumentation で計測 - Railsガイド

関連記事

Rails 7.2.0 Active Record CHANGELOG(全項目リンク付き)

Rails 7.1.0 Active Support CHANGELOG(翻訳)


CONTACT

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