Rails 5.2の注目ポイント:
本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストのchangelogを参照してください。
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 5.1までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 5.2にアップデートしてください。アップグレードの注意点などについてはRuby on Railsアップグレードガイドを参照してください。
Active Storageが、Amazon S3/Google Cloud Storage/Microsoft Azure Storageなどのクラウドストレージにファイルをアップロードし、それらのファイルをActive Recordオブジェクトにアタッチできるようになりました。開発中やテスト中に用いるローカルのディスクベースのサービスも利用でき、バックアップや移行に用いるサブサービスへのミラーリングもサポートされました。 Active Storageの詳細についてはActive Storageの概要を参照してください。
Rails 5.2にRedisキャッシュストアが組み込まれました。 詳しくは、ガイドのRails のキャッシュ機構を参照してください。
Rails 5.2でHTTP/2 Early Hintsがサポートされました。Early Hintsを有効にしてサーバーを起動するには、bin/rails serverに--early-hintsオプションを渡します。
config/credentials.yml.encファイルが追加され、productionアプリケーションの秘密情報(secret)をここに保存できるようになりました。これによって、外部サービスのあらゆる認証credentialを、config/master.keyファイルまたはRAILS_MASTER_KEY環境変数にあるキーで暗号化した形で直接リポジトリに保存できます。Rails.application.secretsやRails 5.1で導入された暗号化済み秘密情報は、最終的にこれによって置き換えられます。
さらに、Rails 5.2ではcredentialを支えるAPIが用意され、その他の暗号化済み設定/キー/ファイルも簡単に扱えます。
詳しくは、Rails セキュリティガイドを参照してください。
Rails 5.2では、アプリケーションの Content Security Policy(CSP)を設定する新しいDSLが使えるようになりました。グローバルなポリシーを1つ設定しておき、続いてリソースベースでポリシーをオーバーライドすることも、lambdaを使ってリクエストごとにヘッダーに値を注入することもできます(マルチテナントのアプリでアカウントのサブドメインを注入するなど)。 詳しくは、Rails セキュリティガイドを参照してください。
変更点について詳しくはChangelogを参照してください。
ジェネレーターとテンプレートでのcapify!を非推奨に指定。
(Pull Request)
rails dbconsoleやrails consoleに環境変数名を通常の引数として渡すことを非推奨に指定。-eオプションを明示的に利用すべき。
(Commit)
Rails::Applicationのサブクラスを用いてRailsサーバーを起動することを非推奨に指定。
(Pull Request)
Railsプラグインテンプレートでのafter_bundleコールバックを非推奨に指定。
config/database.ymlに、すべての環境で読み込まれる共有セクションを追加。
(Pull Request)
プラグインジェネレーターにrailtie.rbを追加。
(Pull Request)
tmp:clearタスクでスクリーンショットファイルを削除する機能。
(Pull Request)
bin/rails app:update実行時に未利用のコンポーネントをスキップ。
最初のアプリケーション生成でAction CableやActive Recordがスキップされると、これらに関連する更新もスキップされる。
(Pull Request)
3-levelデータベース設定利用時にカスタムコネクション名をrails dbconsoleに渡せるようになった。
例: bin/rails dbconsole -c replica.
(Commit)
consoleコマンドやdbconsoleコマンドの実行時に渡す環境名のショートカットが正しく展開されるようになった。
(Commit)
bootsnapをデフォルトのGemfileに追加。
(Pull Request)
rails runnerでプラットフォームを問わずSTDINからのスクリプトを実行するための-をサポート
(Pull Request)
Railsアプリケーション新規作成時にGemfileにruby x.x.xを追加し、.ruby-versionに現在のRubyバージョンを追加するようになった。
(Pull Request)
プラグインジェネレーターに--skip-action-cableオプションを追加。
(Pull Request)
Gemfileにgit_sourceオプションを追加(プラグインジェネレータ用)。
(Pull Request)
Railsプラグインでbin/railsを実行するときに未利用コンポーネントをスキップ。
(Commit)
ジェネレーターのアクションのインデントを最適化。 (Pull Request)
ルーティングのインデントを最適化。 (Pull Request)
プラグインジェネレーターに--skip-yarnオプションを追加。
(Pull Request)
ジェネレータのgemメソッドで引数のバージョンを複数取れるようサポート。
(Pull Request)
development/test環境でアプリケーション名を元にsecret_key_baseを生成。
(Pull Request)
デフォルトのGemfileにmini_magickをコメントアウトの形で追加。
(Pull Request)
Active Storageがrails newまたはrails plugin newでデフォルトで有効。
--skip-active-storageでActive Storageをスキップする。また、--skip-active-recordを用いた場合にもActive Storageをスキップする。
(Pull Request)
変更点について詳しくはChangelogを参照してください。
cable.ymlにhost、port、db、passwordオプションのサポートを追加。
(Pull Request)
PostgreSQLアダプタ利用時のlong stream IDのハッシュを修正。 (Pull Request)
変更点について詳しくはChangelogを参照してください。
ActionController::ParamsParser::ParseErrorを削除。
(Commit)ActionDispatch::TestResponseのエイリアスである#success?、#missing?、#error?を非推奨に指定。
(Pull Request)フラグメントキャッシュでのリサイクル可能キャッシュキーをサポート。 (Pull Request)
フラグメントのキャッシュキー形式を変更(キーchurnのデバッグを容易にするため) (Pull Request)
AEAD暗号化cookieとセッションにGCMを追加。 (Pull Request)
デフォルトでフォージェリーから保護。 (Pull Request)
署名/暗号化済みcookieの期限終了をサーバー側で強制。 (Pull Request)
cookieの:expiresオプションでActiveSupport::Durationオブジェクトをサポート。
(Pull Request)
:pumaサーバー設定にCapybaraを登録済みにした。
(Pull Request)
cookieミドルウェアをシンプルにするためにキーローテーションサポートを追加。 (Pull Request)
HTTP/2向けのEarly Hintsを有効にする機能を追加。 (Pull Request)
システムテストでのheadless Chromeサポートを追加。 (Pull Request)
redirect_backメソッドに:allow_other_hostオプションを追加。
(Pull Request)
assert_recognizesがマウントしたエンジンをトラバースするようにした。
(Pull Request)
Content-Security-Policyヘッダー設定用のDSLを追加。 (Pull Request, Commit, Commit)
モダンなブラウザでサポートされている著名な音声/動画/フォントのMIMEタイプを登録。 (Pull Request)
システムテストのデフォルト出力フォーマットをinlineからsimpleに変更。
(Commit)
システムテストにheadless Firefoxサポートを追加 (Pull Request)
セキュアなX-Download-OptionsおよびX-Permitted-Cross-Domain-Policiesをデフォルトのヘッダーセットに追加。
(Commit)
システムテストで、ユーザーが別のサーバーを手動でしていない場合にのみPumaをデフォルトのサーバーとして設定するように変更。 (Pull Request)
Referrer-Policyヘッダーをデフォルトのヘッダーセットに追加。
(Commit)
Hash#eachの振る舞いをActionController::Parameters#eachに合わせた。
(Pull Request)
Rails UJS向けにnonceの自動生成をサポート。 (Commit)
デフォルトのHSTS max-age値を31536000秒(1年)に更新。
(Commit)
cookiesのto_hメソッドのエイリアスto_hashメソッドを追加
sessionのto_hashメソッドのエイリアスto_hメソッドを追加
(Commit)
変更点について詳しくはChangelogを参照してください。
image_tagのデフォルトのaltテキストを追加するimage_altヘルパーが非推奨になりました。
(Pull Request) JSON Feedsに対応するため、auto_discovery_link_tagに:jsonタイプを追加しました。
(Pull Request)
image_tagヘルパーにsrcsetオプションを追加しました。
(Pull Request)
optgroupとoptionでラップしたfield_error_procのバグを修正しました。
(Pull Request)
form_withがデフォルトでidを生成するようになりました。
(Commit)
preload_link_tagヘルパーを追加しました。
(Pull Request)
グループ化されたセレクト用のgroupメソッドが呼び出し可能オブジェクトとして使えるようになりました。 (Pull Request)
変更点について詳しくはChangelogを参照してください。
Action Mailerクラスで自身の配信ジョブを設定できるようにした。 (Pull Request)
assert_enqueued_email_withテストヘルパーを追加。
(Pull Request)
変更点について詳しくはChangelogを参照してください。
非推奨の#migration_keysを削除。
(Pull Request)
Active Recordオブジェクトをタイプキャストした場合の非推奨quoted_idを削除。
(Commit)
非推奨のdefault引数をindex_name_exists?から削除。
(Commit)
関連付けにおける:class_nameへのクラス名渡し(非推奨)を削除。
(Commit)
非推奨initialize_schema_migrations_tableメソッドと initialize_internal_metadata_tableメソッドを削除。
(Commit)
非推奨のsupports_migrations?メソッドを削除。
(Commit)
非推奨のsupports_primary_key?メソッドを削除。
(Commit)
非推奨のActiveRecord::Migrator.schema_migrations_table_nameメソッドを削除。
(Commit)
非推奨のname引数を#indexesから削除。
(Commit)
非推奨の引数を#verify!から削除
(Commit)
非推奨の.error_on_ignored_order_or_limit設定を削除。
(Commit)
非推奨の#scope_chainを削除。
(Commit)
非推奨の#sanitize_conditionsメソッドを削除。
(Commit)
supports_statement_cache?を非推奨に指定。
(Pull Request)
ActiveRecord::Calculationsのcountやsumに引数とブロックを同時に渡すことを非推奨に指定。
(Pull Request)
Relationをarelに委譲することを非推奨に指定。
(Pull Request)
TransactionStateのset_stateを非推奨に指定。
(Commit)
expand_hash_conditions_for_aggregatesを非推奨に指定(代替はなし)。
(Commit)
動的なフィクスチャアクセサメソッドを引数なしで呼び出した場合に、その種類のフィクスチャをすべて返すようになった。従来は常に空の配列を返していた。 (Pull Request)
Active Recordの属性リーダーをオーバーライドした場合に属性の変更が一貫しなかったのを修正。 (Pull Request)
MySQLの降順インデックスをサポート。 (Pull Request)
bin/rails db:forwardの1回目のマイグレーションを修正。
(Commit)
現在のマイグレーションが存在しない場合にマイグレーション中にUnknownMigrationVersionErrorエラーをraiseするようになった。
(Commit)
データベース構造をダンプするrakeタスクでSchemaDumper.ignore_tablesを考慮するようになった。
(Pull Request)
ActiveSupport::Cacheで新しいバージョン付きエントリを介したキャッシュキーの再利用をサポートするActiveRecord::Base#cache_versionを追加。これによって、ActiveRecord::Base#cache_keyがタイムスタンプを含まない安定したキーを返すようになった。
(Pull Request)
キャストした値がnilの場合にバインドparamの作成を防止。
(Pull Request)
フィクスチャの挿入に一括INSERTを用いてパフォーマンスを改善。 (Pull Request)
ネストしたJOINを表す2つのリレーションをmergeした場合に、mergeされたリレーションのJOINをLEFT OUTER JOINに変換しなくなった。 (Pull Request)
トランザクションのステートを子トランザクションに適用するよう修正。 従来は、ネストしたトランザクションが1つあって外側のトランザクションがロールバックすると、内側のトランザクションのレコードがpersistedとマーキングされたままになることがあった。親トランザクションがロールバックした場合には親トランザクションのステートを子トランザクションに適用することで、この動作を修正した。これによって、内側のトランザクションのレコードが正しくマーキングされ、persistedにならなくなった。 (Commit)
JOINを含むスコープを持つeager-load/preload関連付けを修正。 (Pull Request)
sql.active_record通知サブスクライバによってraiseされるエラーをActiveRecord::StatementInvalid例外に変換されないようにした。
(Pull Request)
レコードを(find_each、find_in_batches、in_batchesで)一括で扱う場合にクエリキャッシュをスキップするようにした。
(Commit)
sqlite3のbooleanシリアライズで1や0を利用するように変更。SQLiteはネイティブで1と0をそれぞれtrueとfalseとして認識するが、従来のシリアライズのtやfはネイティブでは認識しない。
(Pull Request)
マルチパラメータ代入を用いて構成された値が、フィールドが1つのフォーム入力をレンダリングする場合にpost-type-cast値を使うようになった。 (Commit)
モデル生成時にApplicationRecordを生成しないようになった。生成が必要な場合はrails g application_recordで作成できる。
(Pull Request)
Relation#orが、referencesの値のみ異なる2つのリレーションを受け取れるようになった。referencesはwhereによって暗黙に呼び出されることがあるため。
(Commit)
Relation#orを使った場合に、共通の条件を抽出してOR条件の前に配置するようになった。
(Pull Request)
binaryフィクスチャヘルパーメソッドを追加。
(Pull Request)
STI(Single Table Inheritance)で関連付けの逆転を自動で推測するようにした。 (Pull Request)
ロック待ちタイムアウト設定を超えた場合にraiseされるエラークラスLockWaitTimeoutを新しく追加。
(Pull Request)
sql.active_record instrumentationのペイロード名をわかりやすく変更。
(Pull Request)
データベースからのインデックス削除でアルゴリズムを指定できるようになった。 (Pull Request)
Relation#whereにSetを渡した場合の挙動を、配列を渡した場合と同じにした。
(Commit)
PostgreSQLのtsrangeで秒以下の精度が保持されるようになった。
(Pull Request)
ダーティなレコードでlock!を呼ぶとraiseするようになった。
(Commit)
sqliteアダプタ利用時にインデックスのカラム順がdb/schema.rbに記載されないバグを修正。
(Pull Request)
bin/rails db:migrateでVERSIONを指定した場合の動作を修正。VERSIONが空のbin/rails db:migrateの振る舞いは、VERSIONを指定していない場合の動作と同じになった。
VERSIONの形式をチェックし、マイグレーションファイルのバージョン番号または名前であればそれを利用する。VERSIONの形式が無効な場合はエラーをraiseする。対象となるマイグレーションが存在しない場合もエラーをraiseする。
(Pull Request)
ステートメントタイムアウト設定を超えた場合にraiseされるエラークラスStatementTimeoutを新しく追加。
(Pull Request)
update_allで、値をType#serializeに渡す前にType#castに渡すようにした。これにより、update_all(foo: 'true')でbooleanが正しく永続化するようになった。
(Commit)
リレーションクエリメソッドで生SQLフラグメントを使う場合は、そのことを明示的にマーキングしなければならないようになった。 (Commit, Commit)
「up」マイグレーション(新しいカラムの追加など)にのみ関係あるコード用の#up_onlyをデータベースマイグレーションに追加。
(Pull Request)
ユーザーのリクエストが原因でステートメントをキャンセルした場合にraiseされるエラークラスQueryCanceledを新しく追加。
(Pull Request)
Relationのインスタンスメソッドと衝突するスコープ定義を許さないようになった。
(Pull Request)
add_indexにPostgreSQL演算子クラスのサポートを追加。
(Pull Request)
データベースクエリ呼び出し元のログを出力できるようにした。 (Pull Request, Pull Request, Pull Request)
カラム情報をリセットした場合に子孫クラスで属性メソッドをundefineするようになった。 (Pull Request)
delete_allでlimitやoffsetを指定した場合にsubselectを使うようにした。
(Commit)
first(n)をlimit()と併用した場合の矛盾を修正。
first(n)ファインダーがlimit()を考慮するようになったことでrelation.to_a.first(n)(とlast(n)の場合も)の挙動が一貫するようになった。
(Pull Request)
永続化していない親インスタンス上のネストしたhas_many :through関連付けを修正。
(Commit)
レコードを通しで削除する場合に関連付けの条件を考慮するようにした。 (Commit)
saveやsave!の呼び出し後はdestroyされたオブジェクトの改変を禁止。
(Commit)
left_outer_joinsでリレーションをmergeした場合の問題を修正。
(Pull Request)
PostgreSQLの外部テーブルをサポート。 (Pull Request)
Active Recordオブジェクトが複製された場合はトランザクションのステートをクリアするようになった。 (Pull Request)
composed_ofカラムを用いたwhereメソッドに配列オブジェクトを引数として渡した場合に展開されない問題を修正。
(Pull Request)
誤用を防ぐためpolymorphic?の場合にreflection.klassでraiseするようになった。
(Commit)
ORDER BYカラムに他のテーブルの主キーが含まれている場合であってもActiveRecord::FinderMethods#limited_ids_forで正しい主キー値が使われるよう、MySQLとPostgreSQLの#columns_for_distinctを修正。
(Commit)
dependent: :destroyで、has_one/belongs_toリレーションシップの子クラスが削除されていないのに親クラスが削除される問題を修正。
(Commit)
アイドル状態のデータベース接続は従来孤立した接続だったのが、コネクションプールreaperによって定期的に刈り取られるようになった。 Commit
変更点について詳しくはChangelogを参照してください。
ActiveModel::Errorsの#keysメソッドと#valuesメソッドを修正。
#keysはメッセージが空でないキーだけを返すように変更。
#valuesは空でない値だけを返すように変更。
(Pull Request)
#merge!メソッドを追加(ActiveModel::Errors向け)。
(Pull Request)
lengthバリデータオプションにProcやシンボルを渡せるようになった。
(Pull Request)
_confirmationの値がfalseの場合にConfirmationValidatorバリデーションを実行するようになった。
(Pull Request)
procデフォルトを含むattrebutes APIを用いるモデルをマーシャリングできるようになった。 (Commit)
シリアライズで:includesオプションを複数指定しても失われないようにした。
(Commit)
変更点について詳しくはChangelogを参照してください。
コールバックにおける非推奨の:if/:unless文字列フィルタを削除。
(Commit)
非推奨のhalt_callback_chains_on_return_falseオプションを削除。
(Commit)
Module#reachable?メソッドを非推奨に指定。
(Pull Request)
secrets.secret_tokenを非推奨に指定。
(Commit)
fetch_valuesをHashWithIndifferentAccessに追加。
(Pull Request)
Time#changeに:offsetのサポートを追加。
(Commit)
ActiveSupport::TimeWithZone#changeに:offsetと:zoneのサポートを追加。
(Commit)
非推奨通知にgem名と非推奨の期間(horizon)を渡すようにした。 (Pull Request)
バージョン付きキャッシュエントリをサポート。これによりキャッシュストアでキャッシュキーを再利用できるようになり、キャッシュの変動が著しい場合にストレージを大きく節約できるようになった。Active Recordで#cache_keyと#cache_versionを分離し、Action Packのフラグメントキャッシュを利用することで動作する。
(Pull Request)
スレッド分離された属性シングルトンを提供するActiveSupport::CurrentAttributesを追加。主なユースケースは、リクエストごとの属性をシステム全体で簡単に利用できるよう保持することである。
(Pull Request)
#singularizeと#pluralizeが指定のロケールで非可算名詞を考慮するようになった。
(Commit)
class_attributeにデフォルトオプションを追加。
(Pull Request)
曜日を指定すると(現時点から見て)「前回その曜日だった日時」と「次回その曜日になる日時」を返すDate#prev_occurringとDate#next_occurringを追加。
(Pull Request)
モジュールやクラスの属性アクセサにデフォルトオプションを追加。 (Pull Request)
Cacheにwrite_multiを追加。
(Pull Request)
ActiveSupport::MessageEncryptorでAES 256 GCMをデフォルトで利用。
(Pull Request)
テスト時のTime.nowの時間をfreezeするfreeze_timeヘルパーを追加。
(Pull Request)
Hash#reverse_merge!の順序をHashWithIndifferentAccessと一貫するようにした。
(Pull Request)
ActiveSupport::MessageVerifierとActiveSupport::MessageEncryptorでpurpose:や期限指定をサポート。
ActiveSupport::MessageEncryptor.
(Pull Request)
String#camelizeに誤ったオプションが渡されたときにフィードバックを返すようになった。
(Pull Request)
Module#delegate_missing_toで対象がnilの場合にDelegationErrorをraiseするようになった。
(Pull Request)
ActiveSupport::EncryptedFileとActiveSupport::EncryptedConfigurationを追加。
(Pull Request)
productionアプリケーションの秘密情報を保存するconfig/credentials.yml.encを追加。
(Pull Request)
MessageEncryptorとMessageVerifierでキーのローテーションをサポート。
(Pull Request)
HashWithIndifferentAccess#transform_keys が HashWithIndifferentAccess のインスタンスを返すようになった。
(Pull Request)
Hash#sliceがRuby 2.5以降の組み込み定義にフォールバックするようになった(定義済みの場合)。
(Commit)
IO#to_jsonが配列への変換を試みずにto_s表現を返すようになった。読み取り不能オブジェクトでIO#to_jsonを呼ぶとIOErrorがraiseされるバグがこれで修正される。
(Pull Request)
Date#prev_dayやDate#next_dayに合わせてTime#prev_dayとTime#next_dayにも同じメソッドシグネチャを追加。
Time#prev_dayとTime#next_dayに引数を渡せるようになった。
(Commit)
Date#prev_monthやDate#next_monthに合わせてTime#prev_monthとTime#next_monthにも同じメソッドシグネチャを追加。
Time#prev_monthとTime#next_monthに引数を渡せるようになった。
(Commit)
Date#prev_yearやDate#next_yearに合わせてTime#prev_yearとTime#next_yearにも同じメソッドシグネチャを追加。
Time#prev_yearとTime#next_yearに引数を渡せるようになった。
(Commit)
humanizeで略語をサポート。
(Commit)
TimeWithZone(TWZ)のレンジでRange#include?をサポート。
(Pull Request)
1KBを超えるキャッシュをデフォルトで圧縮できるようになった。 (Pull Request)
Redisキャッシュストア。 (Pull Request, Pull Request)
TZInfo::AmbiguousTimeエラーを扱えるようになった。
(Pull Request)
MemCacheStore: 期限切れカウンタをサポート。 (Commit)
ActiveSupport::TimeZone.allがActiveSupport::TimeZone::MAPPINGに含まれるタイムゾーンだけを返すようにした。
(Pull Request)
ActiveSupport::SecurityUtils.secure_compareのデフォルトの振る舞いを変更し、変数の長さの文字列についても長さ情報が漏洩しないようにした。
ActiveSupport::SecurityUtils.secure_compareがfixed_length_secure_compareにリネームされ、渡された文字列の長さが一致しない場合にArgumentErrorをraiseするようになった。
(Pull Request)
SHA-1はETagヘッダーなどの重要度の低いダイジェストの生成に使うようになった。 (Pull Request, Pull Request)
assert_changesによるアサーションが、引数のfrom:とto:の組み合わせにかかわらず常に式の変更をアサーションするようになった。
(Pull Request)
ActiveSupport::Cache::Storeのread_multiになかったinstrumentationを追加。
(Pull Request)
assert_differenceの最初の引数でハッシュをサポート。これにより、同一のアサーションでさまざまな数値の違いを指定できるようになった。
(Pull Request)
キャッシュ: MemCacheやRedis のread_multiとfetch_multiを高速化。バックエンドに問い合わせる前にローカルのインメモリキャッシュから読み取るようになった。
(Commit)
変更点について詳しくはChangelogを参照してください。
ActiveJob::Base.discard_onにブロックを渡すことで、ジョブの破棄をカスタマイズできるようになった。
(Pull Request)変更点について詳しくはChangelogを参照してください。
Railsのスレッディングとコード実行ガイドを追加。 (Pull Request)
Active Storageの概要ガイドを追加。 (Pull Request)
Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。