1 Rails 5.1 へのアップグレード
既存のアプリケーションをアップグレードする場合は、アップグレード前に十分なテストカバレッジを持つことが重要です。また、Rails 5.1 への更新を試みる前に、まず Rails 5.0 にアップグレードし、アプリケーションが正常に動作することを確認してください。アップグレード時に注意するべき事項のリストは、Upgrading Ruby on Rails ガイドで入手できます。
2 主な機能
2.1 Yarn サポート
Rails 5.1 では、Yarn を介して npm から JavaScript の依存関係を管理することができます。これにより、React、VueJS などのライブラリを簡単に使用することができます。Yarn サポートはアセットパイプラインと統合されており、すべての依存関係が Rails 5.1 アプリケーションでシームレスに動作します。
2.2 オプションの Webpack サポート
Rails アプリケーションは、新しい Webpacker gem を使用して、JavaScript アセットバンドラである Webpack とより簡単に統合することができます。Webpack の統合を有効にするには、新しいアプリケーションを生成する際に --webpack
フラグを使用します。
これはアセットパイプラインと完全に互換性があり、画像、フォント、サウンドなどのアセットには引き続きアセットパイプラインを使用することができます。アセットパイプラインで管理される JavaScript コードと、Webpack で処理される他のコードを持つこともできます。これらすべてはデフォルトで有効になっている Yarn によって管理されます。
2.3 jQuery はデフォルトの依存関係ではなくなりました
以前のバージョンの Rails では、data-remote
、data-confirm
などの機能を提供するために jQuery がデフォルトで必要でした。しかし、UJS はプレーンな JavaScript を使用するように書き直されたため、これはもはや必要ではありません。このコードは現在、Action View の rails-ujs
として提供されています。
必要な場合は引き続き jQuery を使用することができますが、デフォルトでは必要ありません。
2.4 システムテスト
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
を削除しました。 (コミット)コントローラーフィルタに関連する廃止予定のメソッドを削除しました。 (コミット)
ActionController::Parameters
でHashWithIndifferentAccess
メソッドを呼び出すサポートを廃止しました。 (コミット)
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_tag
をdatetime-local
フィールドを生成するように変更しました。 (プルリクエスト)HTMLタグのための新しいBuilderスタイルの構文(
tag.div
、tag.br
など)を追加しました。 (プルリクエスト)form_tag
とform_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.one
とactiverecord.errors.messages.restrict_dependent_destroy.many
の i18n スコープを削除しました。 (Commit)単数形とコレクションの関連付けリーダーから非推奨の force-reload 引数を削除しました。 (Commit)
#quote
にカラムを渡すサポートを削除しました。 (Commit)#tables
から非推奨のname
引数を削除しました。 (Commit)#tables
と#table_exists?
の非推奨な振る舞いを修正し、テーブルのみを返すようにしました。 (Commit)ActiveRecord::StatementInvalid#initialize
とActiveRecord::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_conditions
をsanitize_sql
に非推奨としました。 (Pull Request)接続アダプターの
supports_migrations?
を非推奨としました。 (Pull Request)Migrator.schema_migrations_table_name
をSchemaMigration.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_on
とActiveJob::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フォーラムで大歓迎です。