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

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

rails

Rails Developer Meetup に参加してきました【1日目】

1 はじめに2 発表について2.1 安全かつ高速に進めるマイクロサービス化2.2 Rails in Microservices2.3 MySQL/InnoDB の裏側2.4 H2O/mruby でつく ...

rails

関連するモデルのレコードを一緒に作成する方法

1 はじめに1.1 前提条件2 実装2.1 モデルの作成2.2 コントローラの作成2.3 Viewの作成3 さいごに はじめに フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成 ...

laravel logo

LaravelでのDB操作の基礎

1 はじめに2 Eloquent2.1 モデルの定義2.2 モデルの取得2.3 モデルの追加2.4 モデルの更新2.5 モデルの削除2.6 クエリスコープ3 マイグレーション3.1 マイグレーションフ ...

laravel logo

[Laravel] middlewareでHTTPリクエストの前後に処理を入れる

1 はじめに2 middlewareとは3 実装3.1 middleware作成3.2 コード実装4 middleware定義4.1 常に呼び出す4.2 特定のURLにアクセスした時のみ呼び出す4.3 ...

フォロー

follow us in feedly

page_side_300rect

2019年8月
« 7月 9月 »
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

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