BackEnd

Rails 6の変更点と新機能

投稿日:

はじめに

2019年8月16日に約3年ぶりのメジャーバージョンアップである Rails 6 がリリースされました。今回は Rails 5 から Rails 6 にかけての変更点と新しく追加されたコンポーネントについて紹介します。

概要

Rails 6 がリリースされたのは2019年8月15日で2016年6月30日にリリースされた Rails 5 から約3年2ヶ月ぶりのメジャーバージョンアップです。今回のバージョンアップでは15,000以上ものコミットが行われました。

変更点について全てを紹介することはできませんので、今回は以下の変更点について触れていきます。詳細についてはリリースノートをご覧ください。

  • Rubyのサポートバージョン
  • Webpacker
  • 複数データベース接続
  • 並列テスト

Rubyのサポートバージョン

Rails がメジャーバージョンアップする際はサポートする Ruby のバージョンが大幅に上がります。実際に、Rails 5系 では Ruby 2.2 以上をサポートしていましたが、Rails 6系 では Ruby 2.5 以上となりました。

Ruby 2系 以降では毎年マイナーバージョンアップが行われており、バージョンアップから3〜4年ほどでサポートが切れます。それに合わせて Rails は約3年毎にメジャーバージョンアップを行っています。

Webpacker

もともと Rails では JavaScript や CSS などのビルドに Sprockets を使用していましたが、近年のフロントエンド開発ツールの進化に伴い Sprockets の代わりに webpack を使用するケースが増えていきました。

そこで、DHH は webpack のラッパライブラリである Webpacker を開発しました。これにより、Rails から webpack のビルドができるようになり、webpack で生成したライブラリを使用することができるようになりました。

Webpacker 自体は Rails 5.1 から使用することができましたが、Rails 6 では Webpacker がデフォルトになりました。これによる変更点は以下のとおりです。

  • 新規Railsアプリケーションの作成時にwebpackのインストールが自動で行われるようになった
  • Action Cableのジェネレータが生成するコードがCoffeeScriptからJavaScriptに変わった
  • scaffoldのジェネレータがJavaScriptのコードを生成しなくなった
  • rails-ujsやAction Cableなどで使われているRails内のJavaScriptライブラリがnpmで公開されているものになった

今回の変更により Rails 6 では CoffeeScript が一切使われなくなりました。

Webpackerの設定

Webpacker の設定は config/webpacker.yml で行います。ここでは、生成されたファイルの出力先やビルド対象ファイルの指定などを行います。プロジェクト作成時の webpacker.yml の内容は以下のとおりです。

また、 webpack 自体の設定は config/webpack/ ディレクトリの環境ごとの JavaScript ファイルで行います。こちらもプロジェクト作成時の development.js の内容を表示します。

Webpackerでのビルド

Webpacker では webpack を操作するための binstub が提供されています。代表的なコマンドをいくつか紹介します。

上記はデバッグモードでビルドする場合のコマンドです。

上記は webpack-dev-server のラッパコマンドです。このコマンドではファイルの更新時に自動的にビルドされるだけでなくブラウザがリロードされるため、開発中はこちらのコマンドを使うのが良いでしょう。

上記は本番環境向けのビルドタスクです。 webpack が正しくインストールされているかのチェックと webpack でのビルドを行います。

ビルドしたJavaScriptファイルを読み込む

Webpacker でビルドした JavaScript ファイルを読み込むには javascript_pack_tag を使用します。例えば、application.js を読み込むには以下のように記述します。

ほかにも、スタイルシートの読み込み用には stylesheet_pack_tag が、画像ファイルの読み込み用には image_pack_tag があります。

split chunksを使用する場合

split chunks を使用する場合は javascript_pack_tag が使用できません。その場合は代わりに javascript_packs_with_chunks_tag を使用します。

JavaScript以外のアセット

Webpacker のスタイルシートや画像ファイルなどの JavaScript 以外のアセットの管理は発展途上であり、その点は Sprockets に軍配が上がります。そのため、デフォルトでは Webpacker と Sprockets が併用して使用されています。もちろん、 Webpacker のみを使用するように変更することができます。

複数データベース接続

Rails 6 以前は複数のデータベースに接続するには establish_connection メソッドを明示的に呼び出すか、Octopus などのサードパーティ製のコンポーネントに頼る必要がありました。Rails 6 では Active Record に複数データベースへの接続機能が実装され、これにより気軽に2つ以上のデータベースにコネクションを張ることができるようになりました。

データベースの設定は引き続き config/database.yml に記述しますが、Rails 6 からは1階層増えて接続情報に名前をつけられるようになりました。ここでつけた名前はリードレプリカ構成にする場合や異なるデータベースに接続する際に使います。

database.yml の設定例を以下に記載します。

データベース毎にマイグレーションファイルを分けたい場合は another_db のように migrations_paths を指定します。

※ mysql2 のインストールに失敗する場合はこちらが参考になります。

マイグレーションの実行

マイグレーションファイル作成のコマンドは Rails 6 以前と基本的に変わりません。メインのデータベース以外のデータベースのマイグレーションファイルを作成するには –db オプションを指定します。

このようにすると –db オプションで指定したディレクトリにマイグレーションファイルが作成されます。

リードレプリカ構成におけるデータベースの設定

リードレプリカ構成にするにはスレーブ側のデータベースの定義に replica: true を指定します。

こうすることでアプリケーションからの更新系のクエリを受付なくなります。

リードレプリカ構成におけるモデルの設定

リードレプリカの設定はモデルで行います。例えば、database.yml で定義した readonly をスレーブデータベースとして接続するには aplication_record.rb に以下のように connects_to を指定します。

接続先データベースの変更

特定の処理で接続するデータベースを変える場合は connected_to メソッドを使用します。database.yml で定義した another_db に接続するには以下のようにします。

並列テスト

2014年以降、Rails ではユニットテストよりもE2Eテストを強化する方針に転換しました。しかし、E2Eテストでは内部でブラウザエンジンを実行するためオーバーヘッドが大きくなり、その結果テストの実行時間が長くなる傾向にありました。

そこで、Rails 6 ではテストを並列に実行する機能が実装されました。この並列テストでは複数のワーカを起動し、それぞれのワーカで並列にテストを行うようになっています。

ワーカの実行

ワーカはプロセス、もしくはスレッドで実行できます。Linux や macOS などの fork が使用できる環境では fork でプロセスを生成します。逆に、Windows などの fork が使用できない環境ではスレッドを使用します。

データベースの作成

ワーカをプロセスとして実行した場合はワーカ毎に前処理でデータベースが作成されます。そのためワーカ間でのデータベースへの競合は発生しません。しかし、ワーカをスレッドとして実行した場合は前処理でデータベースの作成が行われず、複数のスレッドが同じデータベースを使用するため競合が発生する可能性があります。そのため、スレッドを使用する場合はアプリケーション側で排他制御を意識する必要があります。

Rails 6で追加されたコンポーネント

Rails 6 では新たに Action Text と Action Mailbox というコンポーネントが追加されました。これらのコンポーネントはたしかに便利ですが使わないサービスも多いのではないかと思います。なので、どのようなサービスなのかを簡単に紹介するに留めます。

今回追加されたコンポーネントは Rails 5.2 で追加された Active Storage と密接な関係にあります。そこで、まず始めに Active Storage について簡単におさらいし、その後で新しいコンポーネントについて触れていきます。

Active Storage

Active Storage はファイルアップロードのためのコンポーネントです。ローカルへのアップロードはもちろん、Amazon S3 や Google Cloud Storage などへのアップロードも可能です。

carrierwave などのコンポーネントでは既存のテーブルにファイル情報を保持するカラムを追加する必要がありましたが Active Storage ではファイル情報を管理するテーブルが作られ、Active Record のモデルと紐付けられます。

Action Text

Action Text は WYSIWYG エディタと Rails アプリケーションを連携させるためのコンポーネントです。このコンポーネントでは主に以下の機能を提供します。

  • 入力した内容を保存するカラムの追加
  • テキスト内で入力されたファイルの保存
  • サニタイズ処理

Action Mailbox

Action Mailbox はメール受信処理のコンポーネントです。主にメールの受信、メールごとの処理、処理が終わったメールの削除を行います。メールの受信に関しては SendGrid や Mailgan などのクラウドサービスからのメール受信をサポートしています。

メールを受信してからの処理の流れは以下の通りです。

  1. 各ルートでメールを受信する
  2. 受信したメールを保存する
  3. 振り分け処理用のジョブを登録する
  4. 振り分け処理を実行する
  5. 振り分けたメールを処理する
  6. メール削除用のジョブを登録する

これらの内、4と5についてはユーザが実装する必要があります。

さいごに

今回のバージョンアップでは webpack との連携や複数データベースのサポートなど実際のサービス開発に大きな影響を与える内容が多いのではないでしょうか。今現在 Rails はあまり人気がない印象ですがバージョンアップを機に盛り上がってくれればと思います。

おすすめ書籍

WEB+DB PRESS Vol.111 パーフェクトRuby on Rails メタプログラミングRuby 第2版 Effective Ruby

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

laravel logo

Laravelで画像アップロード実装が楽になるかもしれないlaravel-imageup

1 はじめに2 環境3 導入4 実装5 個人的にハマったこと5.1 配列はダメ5.2 PHPStanで引っかかる6 さいごに7 おすすめ書籍 はじめに こんにちは。webアプリケーションを作る際にファ ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

laravel logo

Laravelの基礎知識

1 はじめに2 Laravelの概要2.1 学習コストが低い2.2 Symfonyがベース2.3 DIを積極的に活用している3 ディレクトリ構成3.1 app3.2 bootstrap3.3 conf ...

Rubyを使ってDialogflowのお勉強

1 はじめに1.1 環境2 とりあえずAPIで叩いてみる2.1 テスト用のIntentを作成2.2 Gemの設定3 Eventについて3.1 WELCOMEイベント3.2 パラメータ付きで叩く3.3 ...

laravel logo

Laravel Cashier サブスクリプションに使用するテーブルを理解する

1 はじめに2 Laravel Cashierのテーブル2.1 usersテーブル2.2 subscriptionsテーブル2.3 supscription_itemsテーブル3 課金情報の更新方法4 ...

フォロー

blog-page_side_responsive

2019年8月
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。