Ruby on Rails 5.0 リリースノート

Rails 5.0の注目ポイント

  • Action Cable
  • Rails API
  • Active Record属性API
  • テストランナー
  • Rakeコマンドをrailsコマンドに統一
  • Sprockets 3
  • Turbolinks 5
  • Ruby 2.2.2以上が必須

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストのchangelogを参照してください。

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 # => "new default"
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と入力するだけでテストランナーを使えます。

テストランナーは、RSpecminitest-reportersmaxitestなどから着想を得ています。 次のような多数の改良が施されています。

  • テストの行番号を指定して単体テストを実行。
  • テストの行番号を指定して複数テストを実行。
  • 失敗の場合のメッセージが改良され、失敗したテストをすぐに再実行できるようになった。
  • -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:appdoc:railsdoc: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:updateapp: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)

  • development環境を自動でアップデートするbin/updateスクリプトを追加。 (Pull Request)

  • rakeタスクをbin/railsで置き換え。 (Pull Request, Pull Request)

  • 生成されるアプリケーションはLinuxやMac OS X上で「ファイルシステムのイベント監視」(evented file system monitor)が有効になる。--skip-listenオプションを追加するとこの機能を無効にできる。 (commitcommit)

  • 生成したアプリケーションは、RAILS_LOG_TO_STDOUT環境変数を使ってproduction環境でSTDOUTへのログ出力を指定できる。 (Pull Request)

  • 新しいアプリケーションでは、IncludeSudomainsヘッダのHSTS(HTTP Strict Transport Security)がデフォルトで有効になる。 (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_torespond_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)

  • assignsassert_templateを削除。これらのメソッドはrails-controller-testing gemに移動された。 (Pull Request)

4.2 非推奨

  • *_filterコールバックをすべて非推奨に指定。今後は*_actionコールバックを使用。 (Pull Request)

  • 結合テストメソッド*_via_redirectを非推奨に指定。今後同じ動作が必要な場合は、はリクエストの呼出し後に follow_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::IntegrationTestActionController::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)

  • ActionController::TestCaseActionDispatch::IntegrationのHTTPリクエストメソッドにキーワード引数構文を統合。 (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_sslconfig.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_whenstale?にレコードのコレクションを渡す機能を追加。 (Pull Request)

  • ActionController::LiveActiveSupport::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 削除されたもの

  • 非推奨の*_pathヘルパーをemailビューから削除。 (commit)

  • 非推奨のdeliverメソッドとdeliver!メソッドを削除。 (commit)

6.2 主な変更点

  • テンプレートを検索するときにデフォルトのロケールとI18nにフォールバックするようになった。 (commit)

  • ジェネレーターで生成されたメーラーに_mailerサフィックスを追加。コントローラやジョブと同様の命名規則に従う。 (Pull Request)

  • assert_enqueued_emailsassert_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_classsymbolized_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_attributes gem のサポートを終了。 (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の:point typeを非推奨に指定。今後はArrayではなくPointオブジェクトを返す新しいtypeを使用。 (Pull Request)

  • trueになる引数を関連付け用メソッドに渡して関連付けを強制的に再読み込みする手法を非推奨に指定。 (Pull Request)

  • 関連付けrestrict_dependent_destroyエラーのキーを非推奨に指定。今後は新しいキー名を使用。 (Pull Request)

  • #tablesの動作を統一。 (Pull Request)

  • SchemaCache#tablesSchemaCache#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_nthoffsetを引数として渡すことを非推奨に指定。今後リレーションでは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)

  • drop_table:if_existsオプションを追加。 (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_torequiredオプションも非推奨に指定。今後は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_sourcesconnection.data_source_exists?を追加。 Active Recordモデル(通常はテーブルやビュー)を支えるリレーションを特定するのに利用できる。 (Pull Request)

  • フィクスチャファイルを使って、モデルのクラスをYAMLファイルそのものの中に設定できるようになった。 (Pull Request)

  • データベースマイグレーションの生成時にuuidをデフォルトの主キーに設定できる機能を追加。(Pull Request)

  • ActiveRecord::Relation#left_joinsActiveRecord::Relation#left_outer_joinsを追加。 (Pull Request)

  • after_{create,update,delete}_commitコールバックを追加。 (Pull Request)

  • クラスのマイグレーションに出現するAPIのバージョンを管理し、既存のマイグレーションを損なわずにパラメータを変更したり、非推奨サイクルの間に書き換えるためにバージョンを強制適用したりできるようにした。 (Pull Request)

  • ActionController::Baseに代わってApplicationControllerを継承するように、ApplicationRecordがアプリケーションのすべてのモデルのスーパークラスとして新設される。この変更により、アプリケーション全体のモデルの動作を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 削除されたもの

8.2 非推奨

  • Active Modelのコールバックチェーンを止めるためにfalseを返すことを非推奨に指定。代わりにthrow(:abort)の利用を推奨。(Pull Request)

  • ActiveModel::Errors#getActiveModel::Errors#setActiveModel::Errors#[]=メソッドの動作が一貫していないため、非推奨に指定。 (Pull Request)

  • validates_length_of:tokenizerオプションを非推奨に指定。今後はRubyの純粋な機能を使用。 (Pull Request)

  • ActiveModel::Errors#add_on_emptyActiveModel::Errors#add_on_blankを非推奨に指定。置き換え先の機能はなし。 (Pull Request)

8.3 主な変更点

  • どのバリデータで失敗したかを調べるActiveModel::Errors#detailsを追加。 (Pull Request)

  • ActiveRecord::AttributeAssignmentActiveModel::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)

  • DelayedJobSidekiqququequeue_classicで、ジョブIDをprovider_job_idとしてActiveJob::Baseに返す機能を追加。 (Pull RequestPull Requestcommit)

  • ジョブを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)

  • Kernelsilence_stderrsilence_streamcapturequietlyから非推奨メソッドを多数削除。 (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-rubyのConcurrent::CountDownLatchを使用。 (Pull Request)

  • number_to_human_size:prefixオプションを非推奨に指定。置き換え先はなし。 (Pull Request)

  • Module#qualified_const_を非推奨に指定。今後はビルトインのModule#const_メソッドを使用。 (Pull Request)

  • コールバック定義に文字列を渡すことを非推奨に指定。 (Pull Request)

  • ActiveSupport::Cache::Store#namespaced_keyActiveSupport::Cache::MemCachedStore#escape_keyActiveSupport::Cache::FileStore#key_file_pathを非推奨に指定。 今後はnormalize_keyを使用。(Pull Requestcommit)

  • 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メソッドをDateTimeDateTimeに追加。 (Pull Request)

  • DateTimeDateTime#next_week#prev_weeksame_timeを追加。 (Pull Request)

  • DateTimeDateTime#yesterday#tomorrowに、#prev_day#next_dayに対応するメソッドを追加。 (Pull Request)

  • ランダムなbase58文字列を生成するSecureRandom.base58を追加。 (commit)

  • file_fixtureActiveSupport::TestCaseに追加。 テストケースからサンプルファイルにアクセスするシンプルな機能を提供する。 (Pull Request)

  • EnumerableArray#withoutを追加。指定の要素を除外して、列挙のコピーを返す。 (Pull Request)

  • ActiveSupport::ArrayInquirerArray#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)

  • DateTimeDateTime#on_weekday?メソッドを追加。 (Pull Request)

  • ActiveSupport::Executor APIとActiveSupport::Reloader APIを公開。アプリケーションコードの実行やアプリケーションの再読み込みプロセスを、コンポーネントやライブラリから管理したり参加したりできる。 (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コントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。

Railsガイド運営チーム (@RailsGuidesJP)

支援・協賛

Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。

  1. Star
  2. このエントリーをはてなブックマークに追加