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)
🔗 以下の非推奨項目を削除
(以下のリンク先は非推奨化時のプルリク情報)
- Remove initializer that was eager loading the schema cache dump by rafaelfranca · Pull Request #51034 · rails/rails
- Unify the logic to determine the default schema cache path for a database configuration by rafaelfranca · Pull Request #50893 · rails/rails
- Deprecate
ConnectionPool#connection
by casperisfine · Pull Request #51230 · rails/rails - Remove SQLite production warning but leave production config disabled by byroot · Pull Request #50463 · rails/rails
- Deprecate config.active_record.warn_on_records_fetched_greater_than by hundredwatt · Pull Request #51007 · rails/rails
- Deprecate defining enums with keywords args by skipkayhil · Pull Request #50987 · rails/rails
- Add more specific exceptions to warn when an adapter is using legacy adapter format by kmcphillips · Pull Request #50150 · rails/rails
- (7.2で削除済み)Add configurable deprecation warning for singular associations by HParker · Pull Request #45344 · rails/rails
- (7.2で削除済み)Active Record commit transaction on return, break and throw by casperisfine · Pull Request #48600 · rails/rails
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より
🔗 Make Float distinguish between float4
and float8
in PostgreSQL by tnagatomi · Pull Request #53107 · rails/rails
参考: 週刊Railsウォッチ20241024: PostgreSQLとMySQLのfloat関連改修
PostgreSQLの浮動小数点で
float4
とfloat8
を区別するよう修正。修正: #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_float
とunsigned_decimal
を非推奨化。MySQL 8.0.17以降、
FLOAT
、DOUBLE
、DECIMAL
型のカラムの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::BusyException
をActiveRecord::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_schema
とdrop_schema
がマイグレーションで逆進可能になった。従来の
create_schema
とdrop_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_one
やbelongs_to
で親を自動保存する場合にコールバックが重複実行されていたのを修正。修正前は、新しい子レコードを新しい関連付けられた親レコードで永続化すると、
before_validation
、after_validation
、before_save
、after_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_of
にfilter
オプションを追加
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
修正前は、この
#post
がNested::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)
🔗 非推奨項目を削除
(以下のリンク先は非推奨化時のプルリク情報)
- Rails::ConsoleMethods deprecation warning should point to the source by zzak · Pull Request #52040 · rails/rails
- Add app.rb and helpers.rb back for backward compatibility by st0012 · Pull Request #51839 · rails/rails
- Fix
config.read_encrypted_secrets
deprecation warning quoting by viralpraxis · Pull Request #51739 · rails/rails
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より
🔗 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より
🔗 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より
🔗 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より
🔗 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-mysql
とmariadb-trilogy
も追加された。これらのオプションを
--devcontainer
フラグと併用することで、mariadb
をDev Containerのデータベースとして使うようになる。元のmysql
やtrilogy
オプションを指定した場合は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より
🔗 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より
🔗 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さん自身によるものです↓。
🔗 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.input
がnil
の場合にRequest#raw_post
でNoMethodError
が発生する問題を修正。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_forever
がimmutable: 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: ETag
とLast-Modified
が両方存在する場合はETagを優先するよう修正
参考: 3.11 config.action_dispatch.strict_freshness
-- Rails アプリケーションの設定項目 - Railsガイド
config.action_dispatch.strict_freshness
を追加。このコンフィグを
true
に設定すると、RFC 7232 Section 6での指定に沿って、ETag
とLast-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-capture
とkeyboard-map
を追加
参考: Permissions Policy - HTTP | MDN
permissions_policy
にdisplay-capture
とkeyboard-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)
🔗 非推奨項目を削除
(以下のリンク先は非推奨化時のプルリク情報)
- Formally deprecate passing
caller
toDeprecation#warn
by casperisfine · Pull Request #50054 · rails/rails - Simplify attr_internal_define by casperisfine · Pull Request #49864 · rails/rails
- Deprecate ActiveSupport::ProxyObject by Earlopain · Pull Request #51638 · rails/rails
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#delete
やActiveSupport::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より
🔗 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.encode
にescape_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
Time
やActiveSupport::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_fs
とDate#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_path
をRails.root
の下にあるものだけにフィルタする。従来のウォッチャーは、変更が発生しないためウォッチャーの不要なgem内のロケールも含め、利用可能なすべてのロケールを取得していた。Nick Schwaderer
同Changelogより
🔗 [ActiveSupport] Add option filter
on in_order_of
by igordepolli · Pull Request #52072 · rails/rails
in_order_of
にfilter
オプションを追加した。
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_difference
やassert_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
のinstrumentationpayload[: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より
🔗 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::Translation
にraise_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)
🔗 非推奨項目を削除
(以下のリンク先は非推奨化時のプルリク情報)
- Deprecate content for void elements in TagBuilder by skipkayhil · Pull Request #50159 · rails/rails
- deprecate passing nil as model arg instead of raising ArgumentError by cjilbert504 · Pull Request #50931 · rails/rails
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_box
をcheckbox
にリネーム
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:start
、direct-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_text
にstore_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
InvariableError
、UnpreviewableError
、UnrepresentableError
のメッセージを改善。メッセージに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_forever
がimmutable: 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より
🔗 Use RAILS_MAX_THREADS
in ActiveJob::AsyncAdapter
by heka1024 · Pull Request #52468 · rails/rails
ActiveJob::AsyncAdapter
でRAILS_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::Notification
のtransmit_subscription_confirmation.action_cable
とtransmit_subscription_rejection.action_cable
のイベントペイロードとしてidentifier
が追加された。Keith Schacht
同Changelogより
補足
#51676は、7.2で追加された以下の機能をさらに拡張したものです。