1 Rails 5.0へのアップグレード
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 4.2までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 5.0にアップデートしてください。アップグレードの注意点などについてはRuby on Railsアップグレードガイド を参照してください。
2 主要な変更
2.1 Action Cable
Action Cable はRails 5 に新しく導入されたフレームワークであり、Rails アプリケーションで WebSockets とその他の部分をシームレスに統合します。
Action Cable が導入されたことで、Rails アプリケーションの効率の良さとスケーラビリティを損なわずに、通常のRailsアプリケーションと同じスタイル・方法でリアルタイム機能をRubyで書くことができます。クライアント側のJavaScriptフレームワークとサーバー側のRubyフレームワークを同時に提供する、フルスタックのフレームワークです。Active RecordなどのORMで書かれたすべてのドメインモデルにアクセスできます。
詳しくは Action Cableの概要 をご覧ください。
2.2 API アプリケーション
APIのみを提供するシンプルなアプリケーションをRailsで簡単に作成できるようになりました。 Twitter APIや GitHub APIのような一般公開APIサーバーはもちろん、カスタムアプリケーション用APIサーバーの作成・公開にも便利です。
API Railsアプリの生成には次のコマンドを使います。
$ rails new my_api --api
上のコマンドでは次の3つの重要な動作を実行します。
- 利用するミドルウェアを通常よりも絞り込んでアプリケーションを起動するよう設定します。特に、ブラウザ向けアプリケーションで有用なミドルウェア(cookiesのサポートなど)を一切利用しなくなります。
-
ApplicationControllerを、通常のActionController::Baseの代わりにActionController::APIから継承します。ミドルウェアと同様、Action Controllerモジュールのうち、ブラウザ向けアプリケーションでしか使われないモジュールをすべて除外します。 - ビュー、ヘルパー、アセットを生成しないようジェネレーターを設定します。
生成されたAPIアプリケーションはAPI提供の基礎となり、必要に応じて機能を追加できるようになります。
詳しくは RailsでAPI専用アプリを作る をご覧ください。
2.3 Active Record属性API
モデルでtypeの属性を定義します。必要であれば、既存の属性をオーバーライドすることもできます。
これを使って、モデルに割り当てられたSQLとの値の変換方法を制御できます。
また、ActiveRecord::Base.whereに渡された値の動作を変更することもできます。これによって、実装の詳細やモンキーパッチに頼ることなく、Active Recordの多くをサポートするドメインオブジェクトを使えるようになります。
以下を行うこともできます。
- Active Recordで検出されたtypeはオーバーライドできます。
- デフォルトの動作も指定できます。
- 属性にはデータベースのカラムは不要です。
# db/schema.rb
create_table :store_listings, force: true do |t|
t.decimal :price_in_cents
t.string :my_string, default: "original default"
end
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
end
store_listing = StoreListing.new(price_in_cents: '10.1')
# 変更前
store_listing.price_in_cents # => BigDecimal.new(10.1)
StoreListing.new.my_string # => "original default"
class StoreListing < ActiveRecord::Base
attribute :price_in_cents, :integer # カスタムのtype
attribute :my_string, :string, default: "new default" # デフォルト値
attribute :my_default_proc, :datetime, default: -> { Time.now } # デフォルト値
attribute :field_without_db_column, :integer, array: true
end
# 変更後
store_listing.price_in_cents # => 10
StoreListing.new.my_string # => 「新しいデフォルト値」
StoreListing.new.my_default_proc # => 2015-05-30 11:04:48 -0600
model = StoreListing.new(field_without_db_column: ["1", "2", "3"])
model.attributes #=> {field_without_db_column: [1, 2, 3]}
カスタムTypeの作成:
独自のtypeを定義できます。独自のtype定義は、値のtypeで定義されたメソッドに応答する場合に限り行えます。deserializeメソッドやcastメソッドは、作成したtypeオブジェクトで呼び出され、データベースやコントローラからのraw入力を引数に取ります。これは、お金のデータで通貨をカスタム換算する場合などに便利です。
クエリ:
ActiveRecord::Base.whereが呼び出されると、モデルのクラスで定義されたtypeを使って値をSQLに変換し、そのtypeオブジェクトでserializeを呼び出します。
これにより、SQLクエリの発行時に行う値の変換方法を、オブジェクトで指定できるようになります。
ダーティトラッキング:
このtypeの属性は、「ダーティトラッキング」の実行方法を変更できるようになります。
詳しくは ドキュメント をご覧ください。
2.4 テストランナー
新しいテストランナーが導入され、Railsからのテスト実行機能が強化されました。
bin/rails testと入力するだけでテストランナーを使えます。
テストランナーは、RSpec、minitest-reporters、maxitestなどから着想を得ています。
次のような多数の改良が施されています。
- テストの行番号を指定して単体テストを実行。
- テストの行番号を指定して複数テストを実行。
- 失敗の場合のメッセージが改良され、失敗したテストをすぐに再実行できるようになった。
-
-fオプションを付けると失敗時に即座にテストを停止できるようになり、全テストの完了を待たなくて済む -
-dオプションを付けるとテストが完了するまでメッセージ出力を待たせることができる。 -
-bオプションを付けると完全な例外バックトレースを出力できる。 -
Minitestと統合されてさまざまなオプションが利用できるようになった:-sでシードデータを指定、-nで特定のテスト名を指定して実行、-vで詳細出力をオン、など。 - テスト出力に色が追加された。
3 Railties
変更の詳細についてはChangelogを参照してください。
3.1 削除されたもの
デバッガのサポートを削除。
debuggerはRuby 2.2でサポートされないため、今後はbyebugを利用すること。 (commit)非推奨の
test:allタスクとtest:all:dbタスクを削除。 (commit)非推奨の
Rails::Rack::LogTailerを削除。 (commit)非推奨の
RAILS_CACHE定数を削除。 (commit)非推奨の
serve_static_assets設定を削除。 (commit)ドキュメント作成タスク
doc:app、doc:rails、doc:guidesを削除。 (commit)Rack::ContentLengthミドルウェアをデフォルトから削除。(Commit)
3.2 非推奨
config.static_cache_controlを廃止。今後はconfig.public_file_server.headersを使用。 (Pull Request)config.serve_static_filesを廃止。今後はconfig.public_file_server.enabledを使用。 (Pull Request)railsタスク名前空間のタスクを削除。今後はapp名前空間が使われる。 (例:rails:updateタスクやrails:templateタスクはapp:updateやapp:templateに変更された) (Pull Request)
3.3 主な変更点
Railsテストランナー
bin/rails testを追加。 (Pull Request)新規アプリケーションやプラグインのREADMEがマークダウン形式の
README.mdになった。 (commit, Pull Request)Railsアプリをtouch
tmp/restart.txtで再起動するbin/rails restartタスクを追加。 (Pull Request)すべての定義済みイニシャライザをRailsでの起動順に出力する
bin/rails initializersタスクを追加。 (Pull Request)developmentモードでのキャッシュのオンとオフを指定する
bin/rails dev:cacheを追加。 (Pull Request)developement環境を自動でアップデートする
bin/updateスクリプトを追加。 (Pull Request)rakeタスクを
bin/railsで置き換え。 (Pull Request, Pull Request)生成されるアプリケーションはLinuxやMac OS X上で「ファイルシステムのイベント監視」(evented file system monitor)が有効になる。
--skip-listenオプションを追加するとこの機能を無効にできる。 (commit、commit)生成したアプリケーションは、
RAILS_LOG_TO_STDOUT環境変数を使ってproduction環境でSTDOUTへのログ出力を指定できる。 (Pull Request)新しいアプリケーションでは、HSTS(HTTP Strict Transport Security)でIncludeSudomainsヘッダを利用できる。 (Pull Request)
アプリケーション ジェネレータから、新しく
config/spring.rbファイルが出力される。これを使用してSpringの監視対象となる共通ファイルを追加できる。 (commit)新規アプリケーション生成時にAction Mailerをスキップする
--skip-action-mailerを追加。 (Pull Request)tmp/sessionsディレクトリと、これに関連するclear rakeタスクを削除。 (Pull Request)scaffoldジェネレータで生成する
_form.html.erbを、ローカル変数を使用するように変更。 (Pull Request)production環境でクラスの自動読み込みを無効化。 (commit)
4 Action Pack
変更の詳細についてはChangelogを参照してください。
4.1 削除されたもの
ActionDispatch::Request::Utils.deep_mungeを削除。 (commit)ActionController::HideActionsを削除。 (Pull Request)プレースホルダメソッドである
respond_toとrespond_withを削除し、responders gemに移動。 (commit)非推奨のアサーションファイルを削除。 (commit)
URLヘルパーで使われていた非推奨の文字列キーを削除。 (commit)
非推奨の
only_pathオプションを*_pathヘルパーから削除。 (commit)非推奨の
NamedRouteCollection#helpersを削除。 (commit)#を含まない:toオプション(非推奨)のルーティング定義サポートを削除。 (commit)非推奨の
ActionDispatch::Response#to_aryを削除。 (commit)非推奨の
ActionDispatch::Request#deep_mungeを削除。 (commit)非推奨の
ActionDispatch::Http::Parameters#symbolized_path_parametersを削除。 (commit)コントローラのテストから非推奨の
use_routeを削除。 (commit)assignsとassert_templateを削除。これらのメソッドはrails-controller-testing gemに移動された。 (Pull Request)
4.2 非推奨
*_filterコールバックをすべて非推奨に指定。今後は*_actionコールバックを使用。 (Pull Request)結合テストメソッド
*_via_redirectを非推奨に指定。今後同じ動作が必要な場合は、はリクエストの呼出し後にUsefollow_redirect!を手動で実行すること。 (Pull Request)AbstractController#skip_action_callbackを非推奨に指定。今後は個別のskip_callbackメソッドを使用。 (Pull Request)renderメソッドの:nothingオプションを非推奨に指定。 (Pull Request)headメソッドの最初のパラメータをHashとして渡すことと、デフォルトのステータスコードの利用を非推奨に指定。 (Pull Request)ミドルウェアのクラス名を文字列やシンボルで表すことを非推奨に指定。今後はクラス名をそのまま使うこと。 (commit)
MIMEタイプを定数として利用することを非推奨に指定(
Mime::HTMLなど)。今後は「Mime[:html]」のように添字演算子内でシンボルを使うこと。 (Pull Request)redirect_to :backを非推奨に指定。今後はRedirectBackErrorを避けるために、redirect_backを使用して必須のfallback_location引数を受け取ること。 (Pull Request)ActionDispatch::IntegrationTestとActionController::TestCaseで位置引数(positional argument)を非推奨に指定。今後はキーワード引数を使用。(Pull Request)パスパラメータ
:controllerと:actionを非推奨に指定。 (Pull Request)コントローラのインスタンスでのenvメソッドを非推奨に指定。 (commit)
ActionDispatch::ParamsParserを非推奨に指定し、ミドルウェアスタックから削除。今後パラメーターパーサーの構成が必要な場合はActionDispatch::Request.parameter_parsers=を使用。 (commit, commit)
4.3 主な変更点
コントローラのアクションの外部で任意のテンプレートでレンダリングする
ActionController::Rendererを追加。 (Pull Request)HTTPリクエスト メソッド
ActionController::TestCaseとActionDispatch::Integrationにキーワード引数構文を統合。 (Pull Request)期限切れのないレスポンスをキャッシュする
http_cache_foreverをAction Controllerに追加。 (Pull Request)リクエストのvariantのわかりやすい指定方法を追加。 (Pull Request)
対応するテンプレートがない場合にはエラーの代わりに
head :no_contentでレンダリングする (Pull Request)コントローラのデフォルトのフォームビルダーをオーバーライドする機能を追加。 (Pull Request)
API専用アプリ向けのサポートを追加。API専用アプリでは
ActionController::Baseの代わりにActionController::APIが追加される。 (Pull Request)ActionController::Parametersは今後HashWithIndifferentAccessを継承しない。 (Pull Request)より安全にSSLを試したりオフにしたりできるよう、
config.force_sslとconfig.ssl_optionsを簡単に導入できるようにした。 (Pull Request)ActionDispatch::Staticに任意のヘッダーを返す機能を追加。 (Pull Request)protect_from_forgeryのprependのデフォルトをfalseに変更。 (commit)ActionController::TestCaseはRails 5.1で専用gemに移行する予定。今後はActionDispatch::IntegrationTestを使用。 (commit)Railsで生成するETagを「強い」ものから「弱い」ものに変更。 (Pull Request)
コントローラのアクションで
renderが明示的に呼び出されず、対応するテンプレートもない場合、エラーの代わりにhead :no_contentを暗黙に出力する。 (Pull Request 1, 2)フォームごとのCSRFトークン用オプションを追加。 (Pull Request)
リクエストのエンコーディングとレスポンスの解析(parse)を結合テストに追加。 (Pull Request)
コントローラのアクションでレスポンスが明示的に定められていない場合の、デフォルトのレンダリングポリシーを更新。 (Pull Request)
コントローラレベルでビューコンテキストにアクセスする
ActionController#helpersを追加。 (Pull Request)破棄されたフラッシュメッセージをセッションに保存せずに除去。 (Pull Request)
fresh_whenやstale?にレコードのコレクションを渡す機能を追加。 (Pull Request)ActionController::LiveをActiveSupport::Concernに変更。ActiveSupport::Concernでextendしていない他のモジュールにはincludeされない。また、ActionController::Liveはproduction環境では有効にならない。ActionController::Liveが使われていると、生成されたスレッドから投げられた:wardenをミドルウェアでキャッチできない問題があった。これに対応するため、Warden/Deviseの認証エラーを扱える特殊なコードをincludeする別のモジュールを使っている開発者を見かける。 (詳細)
5 Action View
変更の詳細についてはChangelogを参照してください。
5.1 削除されたもの
非推奨の
AbstractController::Base::parent_prefixesを削除。 (commit)ActionView::Helpers::RecordTagHelperを削除。この機能はrecord_tag_helper gemに移行済み。 (Pull Request)i18nでのサポート廃止に伴い、
translateの:rescue_formatオプションを削除。 (Pull Request)
5.2 主な変更点
デフォルトのテンプレートハンドラを
ERBからRawに変更。 (commit)コレクションのレンダリングで、複数の部分テンプレート(パーシャル)のキャッシュと取得を一度に行えるようになった。 (Pull Request, commit)
明示的な依存関係指定にワイルドカードによるマッチングを追加。 (Pull Request)
disable_withをsubmitタグのデフォルトの動作に設定。これにより送信時にボタンを無効にし、二重送信を防止する。 (Pull Request)部分テンプレート(パーシャル)名はRubyの有効な識別子ではなくなった。 (commit)
datetime_tagヘルパーでdatetime-localを指定したinputタグが生成されるようになった。 (Pull Request)
6 Action Mailer
変更の詳細についてはChangelogを参照してください。
6.1 削除されたもの
6.2 主な変更点
テンプレートを検索するときにデフォルトのロケールとi18nにフォールバックするようになった。 (commit)
ジェネレーターで生成されたメイラーに
_mailerサフィックスを追加。コントローラやジョブと同様の命名規則に従う。 (Pull Request)assert_enqueued_emailsとassert_no_enqueued_emailsを追加。 (Pull Request)メイラーキュー名を設定する
config.action_mailer.deliver_later_queue_name設定を追加。 (Pull Request)Action Mailerビューでフラグメントキャッシュをサポート。 テンプレートでキャッシュが有効かどうかを検出する
config.action_mailer.perform_caching設定オプションを追加。 (Pull Request)
7 Active Record
変更の詳細については、Changelogを参照してください。
7.1 削除されたもの
ネストした配列をクエリ値として渡す機能(非推奨)を削除。(Pull Request)
非推奨の
ActiveRecord::Tasks::DatabaseTasks#load_schemaを削除。このメソッドはActiveRecord::Tasks::DatabaseTasks#load_schema_forで置き換え済み。 (commit)非推奨の
serialized_attributesを削除。 (commit)has_many :throughの自動カウンタのキャッシュ(非推奨)を削除。 (commit)非推奨の
sanitize_sql_hash_for_conditionsを削除。 (commit)非推奨の
Reflection#source_macroを削除。 (commit)非推奨の
symbolized_base_classとsymbolized_sti_nameを削除。 (commit)非推奨の
ActiveRecord::Base.disable_implicit_join_references=を削除。 (commit)文字列アクセサによる接続使用へのアクセス(非推奨)を削除。 (commit)
インスタンスに依存するプリロード(非推奨)のサポートを削除。 (commit)
PostgreSQLでしか使われない値の範囲の下限値(非推奨)を削除。 (commit)
キャッシュされたArelとのリレーションを変更したときの動作(非推奨)を削除。 今後は
ImmutableRelationエラーが出力される。 (commit)ActiveRecord::Serialization::XmlSerializerをコアから削除。この機能はactivemodel-serializers-xml gemに移行済み。(Pull Request)古い
mysqlデータベースアダプタのサポートをコアから削除。今後は原則としてmysql2を使用。今後古いアダプタのメンテナンス担当者が決まった場合、アダプタは別のgemに切り出される予定。(Pull Request 1], Pull Request 2)protected_attributesgem のサポートを終了。 (commit)PostgreSQL 9.1以前のサポートを削除。 (Pull Request)
activerecord-deprecated_finders gem のサポートを終了。
(commit)
7.2 非推奨
クエリでクラスを値として渡すことを非推奨に指定。ユーザーは文字列を渡すこと。(Pull Request)
Active Recordのコールバックチェーンを止めるために
falseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request)ActiveRecord::Base.errors_in_transactional_callbacks=を非推奨に指定。 (commit)Relation#uniqを非推奨に指定。今後はRelation#distinctを使用。 (commit)PostgreSQLの
:pointtypeを非推奨に指定。今後はArrayではなくPointオブジェクトを返す新しいtypeを使用。 (Pull Request)trueになる引数を関連付け用メソッドに渡して関連付けを強制的に再読み込みする手法を非推奨に指定。 (Pull Request)
関連付け
restrict_dependent_destroyエラーのキーを非推奨に指定。今後は新しいキー名を使用。 (Pull Request)#tablesの動作を統一。 (Pull Request)SchemaCache#tables、SchemaCache#table_exists?、SchemaCache#clear_table_cache!を非推奨に指定。今後は新しい同等のデータソースを使用。 (Pull Request)SQLite3アダプタとMySQLアダプタの
connection.tablesを非推奨に指定。 (Pull Request)#tablesに引数を渡すことを非推奨に指定。一部のアダプタ(mysql2、sqlite3)の#tablesメソッドはテーブルとビューを両方返すが、他のアダプタはテーブルのみを返す。動作を統一するため、今後は#tablesはテーブルのみを返すようになる予定。 (Pull Request)table_exists?を非推奨に指定。#table_exists?メソッドでテーブルとビューが両方チェックされていることがあるため。#tablesの動作を統一するため、今後#table_exists?はテーブルのみをチェックするようになる予定。 (Pull Request)`
find_nthにoffsetを引数として渡すことを非推奨に指定。今後リレーションではoffsetメソッドを使用。 (Pull Request)DatabaseStatementsの{insert|update|delete}_sqlを非推奨に指定。 今後は{insert|update|delete}パブリックメソッドを使用。 (Pull Request)use_transactional_fixturesを非推奨に指定。今後はより明瞭なuse_transactional_testsを使用。 (Pull Request)ActiveRecord::Connection#quoteにカラムを渡すことを非推奨に指定。 (commit)startパラメータを補完するendオプション(バッチ処理の停止位置を指定)をfind_in_batchesに追加。 (Pull Request)
7.3 主な変更点
テーブルの作成中に
foreign_keyオプションをreferencesに追加。 (commit)新しい属性API。(commit)
enumの定義に:_prefix/:_suffixオプションを追加。 (Pull Request, Pull Request)ActiveRecord::Relationに#cache_keyを追加。 (Pull Request)timestampsのデフォルトのnull値をfalseに変更。 (commit)ActiveRecord::SecureTokenを追加。SecureRandomを使うモデル内の属性で一意のトークン生成をカプセル化するメソッド。 (Pull Request):if_existsoption fordrop_tableを追加。 (Pull Request)ActiveRecord::Base#accessed_fieldsを追加。データベース内の必要なデータだけをselectしたい場合に、参照したモデルでどのフィールドが読み出されたかをこのメソッドで簡単に調べられる。 (commit)ActiveRecord::Relationに#orメソッドを追加。WHERE句やHAVING句を結合するOR演算子。 (commit)#touchに:timeオプションを追加。 (Pull Request)ActiveRecord::Base.suppressを追加。指定のブロックを実行中にレシーバーが保存されないようにする。 (Pull Request)関連付けが存在しない場合、
belongs_toでバリデーションエラーが発生するようになった。この機能は関連付けごとにoptional: trueでオフにできる。また、belongs_toのrequiredオプションも非推奨に指定。今後はoptionalを使用。 (Pull Request)db:structure:dumpの動作を設定するconfig.active_record.dump_schemasを追加。 (Pull Request)config.active_record.warn_on_records_fetched_greater_thanオプションを追加。 (Pull Request)MySQLでネイティブJSONデータタイプをサポート。 (Pull Request)
PostgreSQLでのインデックス削除の並列実行をサポート。 (Pull Request)
接続アダプタに
#viewsメソッドと#view_exists?メソッドを追加。 (Pull Request)ActiveRecord::Base.ignored_columnsを追加。カラムの一部をActive Recordに対して隠蔽する。 (Pull Request)connection.data_sourcesとconnection.data_source_exists?Active Recordモデル(通常はテーブルやビュー)を支えるリレーションを特定するのに利用できる。 (Pull Request)フィクスチャファイルを使って、モデルのクラスをYAMLファイルそのものの中に設定できるようになった。 (Pull Request)
データベースマイグレーションの生成時に
uuidをデフォルトの主キーに設定できる機能を追加。(Pull Request)ActiveRecord::Relation#left_joinsとActiveRecord::Relation#left_outer_joinsを追加。 (Pull Request)after_{create,update,delete}_commitコールバックを追加。 (Pull Request)クラスのマイグレーションに出現するAPIのバージョンを管理し、既存のマイグレーションを損なわずにパラメータを変更したり、非推奨サイクルの間に書き換えるためにバージョンを強制適用したりできるようにした。 (Pull Request)
ApplicationRecordがアプリのすべてのモデルのスーパークラスとして新設され、ActionController::Baseに代わってApplicationControllerを継承する。この変更により、アプリ全体のモデルの動作を1か所で変更できるようになった。
(Pull Request)
ActiveRecordに
#second_to_lastメソッドと#third_to_lastメソッドを追加。 (Pull Request)データベースオブジェクト(テーブル、カラム、インデックス)にコメントを追加して、PostgreSQLやMySQLのデータベースメタデータに保存する機能を追加。 (Pull Request)
プリペアドステートメントを
mysql2アダプタに追加(mysql2 0.4.4以降向け)。 従来は古いmysqlアダプタでしかサポートされていなかった。 config/database.ymlにprepared_statements: trueと記述することでプリペアドステートメントが有効になる。 (Pull Request)ActionRecord::Relation#updateを追加。リレーションオブジェクトに対して、そのリレーションにあるすべてのオブジェクトのコールバックでバリデーション(検証)を実行できる。 (Pull Request)saveメソッドに:touchオプションを追加。タイムスタンプを変更せずにレコードを保存する場合に使用。 (Pull Request)PostgreSQL向けに式インデックスと演算子クラスのサポートを追加。 (commit)
ネストした属性のエラーにインデックスを追加する
:index_errorsオプションを追加。 (Pull Request)依存関係の削除(destroy)を双方向に行える機能を追加。 (Pull Request)
トランザクションテストでの
after_commitコールバックのサポートを追加。 (Pull Request)foreign_key_exists?メソッドを追加。テーブルに外部キーが存在するかどうかを確認できる。 (Pull Request)touchメソッドに:timeオプションを追加。レコードに現在時刻以外の時刻を指定する場合に使用。 (Pull Request)
8 Active Model
変更の詳細についてはChangelogを参照してください。
8.1 削除されたもの
非推奨の
ActiveModel::Dirty#reset_#{attribute}とActiveModel::Dirty#reset_changesを削除 (Pull Request)XMLシリアライズを削除。この機能はactivemodel-serializers-xml gemに移行済み。 (Pull Request)
ActionController::ModelNamingモジュールを削除。 (Pull Request)
8.2 非推奨
Active Modelのコールバックチェーンを止めるために
falseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request)ActiveModel::Errors#get、ActiveModel::Errors#set、ActiveModel::Errors#[]=メソッドの動作が一貫していないため、非推奨に指定。 (Pull Request)validates_length_ofの:tokenizerオプションを非推奨に指定。今後はRubyの純粋な機能を使用。 (Pull Request)ActiveModel::Errors#add_on_emptyとActiveModel::Errors#add_on_blankを非推奨に指定。置き換え先の機能はなし。 (Pull Request)
8.3 主な変更点
どのバリデータで失敗したかを調べる
ActiveModel::Errors#detailsを追加。 (Pull Request)ActiveRecord::AttributeAssignmentをActiveModel::AttributeAssignmentにも展開。これにより、include可能なモジュールとしてすべてのオブジェクトで使えるようになる。 (Pull Request)ActiveModel::Dirty#[attr_name]_previously_changed?とActiveModel::Dirty#[attr_name]_previous_changeを追加。モデルの保存後に一時記録された変更に簡単にアクセスできる。 (Pull Request)valid?とinvalid?でさまざまなコンテキストを一度にバリデーションする機能。 (Pull Request)validates_acceptance_ofのデフォルト値として1の他にtrueも指定できるようになった。 (Pull Request)
9 Active Job
変更の詳細についてはChangelogを参照してください。
9.1 主な変更点
ActiveJob::Base.deserializeをジョブクラスに委譲(delegate)。これにより、ジョブがシリアライズされたときやジョブ実行時に再度読み込まれたときに、ジョブを任意のメタデータにアタッチできるようになる。 (Pull Request)キューアダプタをジョブ単位で構成する機能を追加。ジョブ同士が影響しないように構成できる。 (Pull Request)
ジェネレータのジョブがデフォルトで
app/jobs/application_job.rbを継承するようになった。 (Pull Request)DelayedJob、Sidekiq、qu、que、queue_classicで、ジョブIDをprovider_job_idとしてActiveJob::Baseに返す機能を追加。 (Pull Request、Pull Request、commit)ジョブを
concurrent-rubyスレッドプールにキューイングする簡単なAsyncJobプロセッサと、関連するAsyncAdapterを実装。 (Pull Request)デフォルトのアダプタをinlineからasyncに変更。デフォルトをasyncにすることで、テストを同期的な振る舞いに依存せずに行える。 (commit)
10 Active Support
変更の詳細についてはChangelogを参照してください。
10.1 削除されたもの
非推奨の
ActiveSupport::JSON::Encoding::CircularReferenceErrorを削除。 (commit)非推奨の
ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=メソッドとActiveSupport::JSON::Encoding.encode_big_decimal_as_stringメソッドを削除。 (commit)非推奨の
ActiveSupport::SafeBuffer#prependを削除。 (commit)Kernel、silence_stderr、silence_stream、capture、quietlyから非推奨メソッドを多数削除。 (commit)非推奨の
active_support/core_ext/big_decimal/yaml_conversionsファイルを削除。 (commit)非推奨の
ActiveSupport::Cache::Store.instrumentメソッドとActiveSupport::Cache::Store.instrument=メソッドを削除。 (commit)非推奨の
Class#superclass_delegating_accessorを削除。 今後はClass#class_attributeを使用。 (Pull Request)非推奨の
ThreadSafe::Cacheを削除。今後はConcurrent::Mapを使用。 (Pull Request)Ruby 2.2 で既に実装されている
Object#itselfを削除。 (Pull Request)
10.2 非推奨
MissingSourceFileを非推奨に指定。今後はLoadErrorを使用。 (commit)alias_method_chainを非推奨に指定。今後はRuby 2.0 で導入されたModule#prependを使用。 (Pull Request)ActiveSupport::Concurrency::Latchを非推奨に指定。今後はConcurrent::CountDownLatchfrom concurrent-rubyを使用。 (Pull Request):prefixoption ofnumber_to_human_sizeを非推奨に指定。置き換え先はなし。 (Pull Request)Module#qualified_const_を非推奨に指定。今後はビルトインのModule#const_メソッドを使用。 (Pull Request)コールバック定義に文字列を渡すことを非推奨に指定。 (Pull Request)
ActiveSupport::Cache::Store#namespaced_key、ActiveSupport::Cache::MemCachedStore#escape_key、ActiveSupport::Cache::FileStore#key_file_pathを非推奨に指定。 今後はnormalize_keyを使用。
ActiveSupport::Cache::LocaleCache#set_cache_valueを非推奨に指定。今後はwrite_cache_valueを使用。
(Pull Request)
assert_nothing_raisedに引数を渡すことを非推奨に指定。 (Pull Request)Module.local_constantsを非推奨に指定。今後はModule.constants(false)を使用。 (Pull Request)
10.3 主な変更点
ActiveSupport::MessageVerifierに#verifiedメソッドと#valid_message?メソッドを追加。 (Pull Request)コールバックチェーンの停止方法を変更。今後は明示的に
throw(:abort)で停止することを推奨。 (Pull Request)新しい設定オプション
config.active_support.halt_callback_chains_on_return_falseを追加。ActiveRecord、ActiveModel、ActiveModel::Validationsのコールバックチェーンを、'before'コールバックでfalseを返したときに停止するかどうかを指定する。 (Pull Request)デフォルトのテスト実行順を
:sortedから:randomに変更。 (commit)#on_weekend?メソッド、#on_weekday?メソッド、#next_weekdayメソッド、#prev_weekdayメソッドをDate、Time、DateTimeに追加。 (Pull Request)Date、Time、DateTimeの#next_weekと#prev_weekにsame_timeを追加。 (Pull Request)Date、Time、DateTimeの#yesterdayと#tomorrowに、#prev_dayと#next_dayに対応するメソッドを追加。 (Pull Request)ランダムなbase58文字列を生成する
SecureRandom.base58を追加。 (commit)file_fixtureをActiveSupport::TestCaseに追加。 テストケースからサンプルファイルにアクセスするシンプルな機能を提供する。 (Pull Request)EnumerableとArrayに#withoutを追加。指定の要素を除外して、列挙のコピーを返す。 (Pull Request)ActiveSupport::ArrayInquirerとArray#inquiryを追加。 (Pull Request)指定のタイムゾーンで時刻を解析する
ActiveSupport::TimeZone#strptimeを追加。 (commit)Integer#zero?に加えてInteger#positive?とInteger#negative?クエリメソッドを追加。 (commit)ActiveSupport::OrderedOptionsに破壊的なgetメソッドを追加。値が.blank?の場合はKeyErrorが発生。 (Pull Request)指定の年の日数を返す
Time.days_in_yearを追加。引数がない場合は現在の年の日数を返す。 (commit)ファイルのイベント監視機能を追加。アプリケーションのソースコード、ルーティング、ロケールなどの変更を非同期的に検出する。 (Pull Request)
スレッドごとのクラス変数やモジュール変数を宣言するメソッド群 thread_m/cattr_accessor/reader/writer を追加。 (Pull Request)
Array#second_to_lastメソッドとArray#third_to_lastメソッドを追加。 (Pull Request)Date、Time、DateTimeに#on_weekday?メソッドを追加。 (Pull Request)ActiveSupport::ExecutorAPIとActiveSupport::ReloaderAPIを公開。アプリケーションコードの実行やアプリケーションの再読み込みプロセスを、コンポーネントやライブラリから管理したり参加したりできる。 (Pull Request)ActiveSupport::DurationでISO8601形式のフォーマットや解析をサポート。 (Pull Request)ActiveSupport::JSON.decodeでISO8601形式のローカル時刻をサポート(parse_json_timesを有効にした場合)。 (Pull Request)ActiveSupport::JSON.decodeが日付の文字列ではなくDateオブジェクトを返すようになった。 (Pull Request)TaggedLoggingをロガーに追加。ロガーのインスタンスを複数作成して、タグがロガー同士で共有されないようにする。 (Pull Request)
11 クレジット表記
Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。
フィードバックについて
本ガイドは GitHub上の yasslab/railsguides.jp で管理・公開されております。 本ガイドを読んで気になる文章や間違ったコードを見かけたら、上記リポジトリにてお気軽に Issue を出して頂けると嬉しいです。また、「Pull Request を送りたい!」という場合には、Ruby on Railsガイドのガイドラインと、READMEに記載されている「翻訳の流れ」をご参考にしてください。
なお、原著における間違いを見つけたら、「Ruby on Railsに貢献する方法」に記されているRailsのドキュメントに貢献するを参考にしながら、ぜひRailsコミュニティに貢献してみてしてください :)
本ガイドの品質向上に向けて、皆さまのご協力が得られれば幸いです。よろしくお願い致します。