edge
詳細はrubyonrails.orgで: もっとRuby on Rails

Ruby on Rails 5.1 リリースノート

Rails 5.1 のハイライト:

これらのリリースノートは主な変更のみをカバーしています。さまざまなバグ修正や変更については、changelog を参照するか、GitHub 上のメイン Rails リポジトリの コミットリスト をご覧ください。

1 Rails 5.1 へのアップグレード

既存のアプリケーションをアップグレードする場合は、アップグレード前に十分なテストカバレッジを持つことが重要です。また、Rails 5.1 への更新を試みる前に、まず Rails 5.0 にアップグレードし、アプリケーションが正常に動作することを確認してください。アップグレード時に注意するべき事項のリストは、Upgrading Ruby on Rails ガイドで入手できます。

2 主な機能

2.1 Yarn サポート

Pull Request

Rails 5.1 では、Yarn を介して npm から JavaScript の依存関係を管理することができます。これにより、React、VueJS などのライブラリを簡単に使用することができます。Yarn サポートはアセットパイプラインと統合されており、すべての依存関係が Rails 5.1 アプリケーションでシームレスに動作します。

2.2 オプションの Webpack サポート

Pull Request

Rails アプリケーションは、新しい Webpacker gem を使用して、JavaScript アセットバンドラである Webpack とより簡単に統合することができます。Webpack の統合を有効にするには、新しいアプリケーションを生成する際に --webpack フラグを使用します。

これはアセットパイプラインと完全に互換性があり、画像、フォント、サウンドなどのアセットには引き続きアセットパイプラインを使用することができます。アセットパイプラインで管理される JavaScript コードと、Webpack で処理される他のコードを持つこともできます。これらすべてはデフォルトで有効になっている Yarn によって管理されます。

2.3 jQuery はデフォルトの依存関係ではなくなりました

Pull Request

以前のバージョンの Rails では、data-remotedata-confirm などの機能を提供するために jQuery がデフォルトで必要でした。しかし、UJS はプレーンな JavaScript を使用するように書き直されたため、これはもはや必要ではありません。このコードは現在、Action View の rails-ujs として提供されています。

必要な場合は引き続き jQuery を使用することができますが、デフォルトでは必要ありません。

2.4 システムテスト

Pull Request

Rails 5.1 には、Capybara テストを書くための組み込みサポートであるシステムテストがあります。このようなテストのために Capybara やデータベースのクリーニング戦略を設定する必要はもはやありません。Rails 5.1 では、失敗スクリーンショットなどの追加機能を備えた Chrome でテストを実行するためのラッパーが提供されています。

2.5 暗号化されたシークレット

プルリクエスト

Railsは、sekrets gemに触発され、アプリケーションのシークレットを安全な方法で管理することができるようになりました。

bin/rails secrets:setupを実行して、新しい暗号化されたシークレットファイルをセットアップします。これにより、リポジトリの外部に保存する必要があるマスターキーも生成されます。シークレット自体は、暗号化された形式でリビジョン管理システムに安全にチェックインすることができます。

シークレットは、本番環境でRAILS_MASTER_KEY環境変数またはキーファイルに保存されたキーを使用して復号されます。

2.6 パラメータ化されたメーラー

プルリクエスト

メーラークラスのすべてのメソッドで使用される共通パラメータを指定して、インスタンス変数、ヘッダー、およびその他の共通のセットアップを共有することができるようになりました。

class InvitationsMailer < ApplicationMailer
  before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
  before_action { @account = params[:inviter].account }

  def account_invitation
    mail subject: "#{@inviter.name}さんがあなたをBasecamp(#{@account.name})に招待しました"
  end
end
InvitationsMailer.with(inviter: person_a, invitee: person_b)
                 .account_invitation.deliver_later

2.7 直接的なルートと解決されたルート

プルリクエスト

Rails 5.1では、ルーティングDSLにresolveメソッドとdirectメソッドの2つの新しいメソッドが追加されました。resolveメソッドを使用すると、モデルの多態性マッピングをカスタマイズすることができます。

resource :basket

resolve("Basket") { [:basket] }
<%= form_for @basket do |form| %>
  <!-- バスケットフォーム -->
<% end %>

これにより、通常の/baskets/:idではなく、単数形のURL /basketが生成されます。

directメソッドを使用すると、カスタムのURLヘルパーを作成することができます。

direct(:homepage) { "https://rubyonrails.org" }

homepage_url # => "https://rubyonrails.org"

ブロックの戻り値は、url_forメソッドの有効な引数である必要があります。したがって、有効な文字列URL、ハッシュ、配列、Active Modelのインスタンス、またはActive Modelクラスを渡すことができます。

direct :commentable do |model|
  [ model, anchor: model.dom_id ]
end

direct :main do
  { controller: 'pages', action: 'index', subdomain: 'www' }
end

2.8 form_forとform_tagをform_withに統合

プルリクエスト

Rails 5.1以前では、HTMLフォームを処理するための2つのインターフェースがありました。モデルインスタンスの場合はform_for、カスタムURLの場合はform_tagを使用します。

Rails 5.1では、これらのインターフェースをform_withで統合し、URL、スコープ、またはモデルに基づいてフォームタグを生成することができます。

URLのみを使用する場合:

<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# 生成されるHTML %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="title">
</form>

スコープを追加すると、入力フィールドの名前にプレフィックスが付きます:

<%= form_with scope: :post, url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# 生成されるHTML %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

モデルを使用すると、URLとスコープの両方が推測されます:

<%= form_with model: Post.new do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# 生成されるもの %>

<form action="/posts" method="post" data-remote="true">
  <input type="text" name="post[title]">
</form>

既存のモデルを使用すると、更新フォームが作成され、フィールドの値が入力されます:

<%= form_with model: Post.first do |form| %>
  <%= form.text_field :title %>
<% end %>

<%# 生成されるもの %>

<form action="/posts/1" method="post" data-remote="true">
  <input type="hidden" name="_method" value="patch">
  <input type="text" name="post[title]" value="<投稿のタイトル>">
</form>

3 非互換性

以下の変更は、アップグレード時に即座の対応が必要です。

3.1 複数の接続を持つトランザクションテスト

トランザクションテストは、すべてのActive Record接続をデータベーストランザクションでラップします。

テストが追加のスレッドを生成し、それらのスレッドがデータベース接続を取得する場合、これらの接続は特別に処理されます:

スレッドは、管理されたトランザクション内にある単一の接続を共有します。これにより、すべてのスレッドが同じ状態のデータベースを見ることができますが、最も外側のトランザクションは無視されます。以前は、このような追加の接続は、例えばフィクスチャの行を見ることができませんでした。

スレッドがネストされたトランザクションに入ると、一時的に接続の排他的な使用権を取得し、分離性を維持します。

テストが現在、生成されたスレッド内で別個のトランザクション外の接続を取得することに依存している場合、より明示的な接続管理に切り替える必要があります。

テストがスレッドを生成し、それらのスレッドが明示的なデータベーストランザクションを使用しながら相互作用する場合、この変更によりデッドロックが発生する可能性があります。

この新しい動作から抜け出す簡単な方法は、影響を受けるテストケースでトランザクションテストを無効にすることです。

4 Railties

詳細な変更については、変更履歴を参照してください。

4.1 削除

  • 廃止予定のconfig.static_cache_controlを削除しました。 (commit)

  • 廃止予定のconfig.serve_static_filesを削除しました。 (commit)

  • 廃止予定のファイルrails/rack/debuggerを削除しました。 (commit)

  • 廃止予定のタスク: rails:update, rails:template, rails:template:copy, rails:update:configsおよびrails:update:binを削除しました。 (commit)

  • routesタスクのCONTROLLER環境変数を廃止しました。 (commit)

  • rails newコマンドから-j(--javascript)オプションを削除しました。 (Pull Request)

4.2 注目すべき変更

  • すべての環境で読み込まれるconfig/secrets.ymlに共有セクションを追加しました。 (commit)

  • 設定ファイルconfig/secrets.ymlは、すべてのキーをシンボルとして読み込むようになりました。 (Pull Request)

  • デフォルトのスタックからjquery-railsを削除しました。Action Viewに付属しているrails-ujsがデフォルトのUJSアダプタとして含まれています。 (Pull Request)

  • 新しいアプリケーションにYarnのサポートを追加し、yarn binstubとpackage.jsonを含めました。 (Pull Request)

  • --webpackオプションを介して新しいアプリケーションにWebpackのサポートを追加し、rails/webpacker gemに委譲します。 (Pull Request)

  • 新しいアプリを生成する際に、オプション--skip-gitが指定されていない場合は、Gitリポジトリを初期化します。 (プルリクエスト)

  • config/secrets.yml.encに暗号化されたシークレットを追加します。 (プルリクエスト)

  • rails initializersでrailtieクラス名を表示します。 (プルリクエスト)

5 Action Cable

詳細な変更については、Changelogを参照してください。

5.1 注目すべき変更点

  • cable.ymlのRedisおよびイベント駆動型Redisアダプタにchannel_prefixのサポートを追加し、同じRedisサーバーを複数のアプリケーションで使用する際の名前の衝突を回避します。 (プルリクエスト)

  • データをブロードキャストするためのActiveSupport::Notificationsフックを追加します。 (プルリクエスト)

6 Action Pack

詳細な変更については、Changelogを参照してください。

6.1 削除された機能

  • ActionDispatch::IntegrationTestおよびActionController::TestCaseクラスの#process#get#post#patch#put#delete#headでの非キーワード引数のサポートを削除しました。 (コミット, コミット)

  • 廃止予定のActionDispatch::Callbacks.to_prepareおよびActionDispatch::Callbacks.to_cleanupを削除しました。 (コミット)

  • コントローラーフィルタに関連する廃止予定のメソッドを削除しました。 (コミット)

  • renderでのtextおよびnothingへの廃止予定のサポートを削除しました。 (コミット, コミット)

  • ActionController::ParametersHashWithIndifferentAccessメソッドを呼び出すサポートを廃止しました。 (コミット)

6.2 廃止予定の機能

  • config.action_controller.raise_on_unfiltered_parametersを廃止しました。Rails 5.1では何の効果もありません。 (コミット)

6.3 注目すべき変更点

  • ルーティングDSLにdirectおよびresolveメソッドを追加しました。 (プルリクエスト)

  • アプリケーションでシステムテストを記述するための新しいActionDispatch::SystemTestCaseクラスを追加しました。 (プルリクエスト)

7 Action View

詳細な変更については、Changelogを参照してください。

7.1 削除された機能

  • ActionView::Template::Error#original_exceptionを削除しました。 (コミット)

  • strip_tagsからencode_special_charsオプションを削除しました。 (プルリクエスト)

7.2 廃止予定の機能

  • Erubis ERBハンドラをErubiに置き換えるためにErubis ERBハンドラを廃止しました。 (プルリクエスト)

7.3 注目すべき変更点

  • Rawテンプレートハンドラ(Rails 5のデフォルトテンプレートハンドラ)は、HTMLセーフな文字列を出力するようになりました。 (コミット)

  • datetime_fieldおよびdatetime_field_tagdatetime-localフィールドを生成するように変更しました。 (プルリクエスト)

  • HTMLタグのための新しいBuilderスタイルの構文(tag.divtag.brなど)を追加しました。 (プルリクエスト)

  • form_tagform_forの使用方法を統一するためにform_withを追加しました。 (プルリクエスト)

  • current_page?check_parametersオプションを追加しました。 (プルリクエスト)

8 Action Mailer

詳細な変更については、Changelogを参照してください。

8.1 注目すべき変更点

  • 添付ファイルが含まれ、本文がインラインで設定されている場合にカスタムコンテンツタイプを設定できるようにしました。 (プルリクエスト)

  • defaultメソッドにラムダ式を値として渡すことができるようにしました。 (コミット)

  • 異なるメーラーアクション間で共有するために、メーラーのパラメータ化された呼び出しをサポートし、共通の前フィルタとデフォルトを共有できるようにしました。 (コミット)

  • メーラーアクションへの引数をprocess.action_mailerイベントのargsキーの下に渡すようにしました。 (プルリクエスト)

9 Active Record

詳細な変更については、Changelogを参照してください。

9.1 削除された機能

  • ActiveRecord::QueryMethods#select への引数とブロックの同時渡しのサポートを削除しました。 (Commit)

  • activerecord.errors.messages.restrict_dependent_destroy.oneactiverecord.errors.messages.restrict_dependent_destroy.many の i18n スコープを削除しました。 (Commit)

  • 単数形とコレクションの関連付けリーダーから非推奨の force-reload 引数を削除しました。 (Commit)

  • #quote にカラムを渡すサポートを削除しました。 (Commit)

  • #tables から非推奨の name 引数を削除しました。 (Commit)

  • #tables#table_exists? の非推奨な振る舞いを修正し、テーブルのみを返すようにしました。 (Commit)

  • ActiveRecord::StatementInvalid#initializeActiveRecord::StatementInvalid#original_exception の非推奨な original_exception 引数を削除しました。 (Commit)

  • クエリ内の値としてクラスを渡すサポートを削除しました。 (Commit)

  • LIMIT にカンマを使用してクエリを行うサポートを削除しました。 (Commit)

  • #destroy_all の非推奨な conditions パラメータを削除しました。 (Commit)

  • #delete_all の非推奨な conditions パラメータを削除しました。 (Commit)

  • #load_schema_for メソッドを非推奨とし、#load_schema を使用するようにしました。 (Commit)

  • #raise_in_transactional_callbacks 設定を非推奨としました。 (Commit)

  • #use_transactional_fixtures 設定を非推奨としました。 (Commit)

9.2 非推奨

  • error_on_ignored_order_or_limit フラグを error_on_ignored_order に非推奨としました。 (Commit)

  • sanitize_conditionssanitize_sql に非推奨としました。 (Pull Request)

  • 接続アダプターの supports_migrations? を非推奨としました。 (Pull Request)

  • Migrator.schema_migrations_table_nameSchemaMigration.table_name に変更しました。 (Pull Request)

  • クォーテーションと型キャストで #quoted_id を使用することを非推奨としました。 (Pull Request)

  • #index_name_exists?default 引数を渡すことを非推奨としました。 (Pull Request)

9.3 注目すべき変更

  • デフォルトのプライマリキーを BIGINT に変更しました。 (Pull Request)

  • MySQL 5.7.5+ と MariaDB 5.2.0+ で仮想/生成列をサポートしました。 (Commit)

  • バッチ処理での LIMIT のサポートを追加しました。 (Commit)

  • トランザクションテストは、すべての Active Record 接続をデータベーストランザクションでラップするようになりました。 (Pull Request)

  • mysqldump コマンドの出力からコメントをデフォルトでスキップするようにしました。 (Pull Request)

  • ActiveRecord::Relation#count を修正し、ブロックが引数として渡された場合には Ruby の Enumerable#count を使用してレコードをカウントするようにしました。 (Pull Request)

  • psql コマンドに "-v ON_ERROR_STOP=1" フラグを渡して、SQL エラーを抑制しないようにしました。 (Pull Request)

  • ActiveRecord::Base.connection_pool.stat を追加しました。 (Pull Request)

  • ActiveRecord::Migration から直接継承するとエラーが発生します。マイグレーションが書かれた Rails のバージョンを指定してください。 (Commit)

  • through 関連付けに曖昧なリフレクション名がある場合にエラーが発生します。 (Commit)

10 Active Model

詳細な変更については、Changelog を参照してください。

10.1 削除

  • ActiveModel::Errors の非推奨メソッドを削除しました。 (commit)

  • 長さバリデーターの :tokenizer オプションを削除しました。 (commit)

  • コールバックの返り値が false の場合にコールバックを中断する非推奨な振る舞いを削除しました。 (commit)

10.2 注目すべき変更

  • モデル属性に割り当てられた元の文字列が誤って凍結されなくなりました。 (Pull Request) アクティブジョブ -----------

詳細な変更については、変更履歴を参照してください。

10.3 削除

  • .queue_adapter にアダプタクラスを渡すサポートが非推奨となりました。 (commit)

  • ActiveJob::DeserializationError#original_exception が非推奨となりました。 (commit)

10.4 注目すべき変更

  • ActiveJob::Base.retry_onActiveJob::Base.discard_on を使用した宣言的な例外処理の追加。 (Pull Request)

  • リトライが失敗した後のカスタムロジックで job.arguments のようなものにアクセスできるように、ジョブインスタンスをイールドします。 (commit)

11 アクティブサポート

詳細な変更については、変更履歴を参照してください。

11.1 削除

  • ActiveSupport::Concurrency::Latch クラスが削除されました。 (Commit)

  • halt_callback_chains_on_return_false が削除されました。 (Commit)

  • 戻り値が false の場合にコールバックを停止する非推奨の動作が削除されました。 (Commit)

11.2 廃止予定

  • トップレベルの HashWithIndifferentAccess クラスは、ActiveSupport::HashWithIndifferentAccess クラスにソフトウェア的に廃止予定となりました。 (Pull Request)

  • set_callback および skip_callback の条件オプション :if および :unless に文字列を渡すことは非推奨となりました。 (Commit)

11.3 注目すべき変更

  • DST の変更に関して一貫性のあるパースとトラベリングを修正しました。 (Commit, Pull Request)

  • Unicode をバージョン 9.0.0 に更新しました。 (Pull Request)

  • Duration#ago および #since のエイリアスとして Duration#before および #after を追加しました。 (Pull Request)

  • 現在のオブジェクトで定義されていないメソッド呼び出しをプロキシオブジェクトに委譲するための Module#delegate_missing_to を追加しました。 (Pull Request)

  • 現在の日付と時刻を表す範囲を返す Date#all_day を追加しました。 (Pull Request)

  • テストのための assert_changes および assert_no_changes メソッドを導入しました。 (Pull Request)

  • travel および travel_to メソッドは、ネストした呼び出しで例外を発生させるようになりました。 (Pull Request)

  • DateTime#change を usec および nsec をサポートするように更新しました。 (Pull Request)

12 クレジット

Rails の安定かつ堅牢なフレームワークに多くの時間を費やした多くの人々に感謝します。Rails の 貢献者の完全なリストを参照してください。

フィードバック

このガイドの品質向上にご協力ください。

タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。

不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。

修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください

そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。