Rails 5の新機能
まず、冒頭でも触れたRails 5の新機能の目玉である、Action CableとAPIモードの概要を紹介します。
Action Cable
Action CableはRails上でWebSocketによる双方向通信を簡単に実現する新しい機能です。WebSocketによる双方向通信を実現するには、サーバーサイドとクライアントサイドの両方の対応が必要となります。Action Cableでは、サーバーサイドの仕組みとしてチャネル層を提供し、クライアントサイドの仕組みとしてJavaScript層を提供しています。
具体的な機能として、リアルタイム性のあるチャットや通知があげられます。本連載では後半の章で、実際にAction Cableを使用したチャット機能を実装していく予定です。
また、この機能の実現のために、デフォルトのWebサーバーがRails 4まで採用されていたWEBrickから、Pumaに変更されました。
APIモード
APIモードはその名の通り、RailsをAPIとしてのみ動作させたい場合に使用する機能です。これまでRailsをAPIとしてのみ使用する場合でも、Railsのジェネレーター(rails generate)を使うと本来不要なviewテンプレート、CSSやJavaScriptが生成されていました。
APIモードを有効にしたい場合、Railsプロジェクトを生成する際に、rails new [アプリケーション名] --apiといったように--apiオプションを付与します。
こうして生成したRailsアプリケーションでは、APIとして最低限必要な機能が有効化されます。
また、ApplicationControllerの継承元がActionController::Baseではなく、ActionController::APIとなります。
さらに、viewテンプレート、CSSやJavaScriptがジェネレーターで生成されなくなります。
ActiveRecord関連の変更点
ActiveRecordとは、Railsが採用するORMフレームワークです。ActiveRecordを使用すれば、SQL文を直接書く代わりに短いアクセスコードを書くだけで、データベースに依存しないデータリソースへのアクセスが可能です。
以下では、主なActiveRecord回りの変更点についてご紹介します。
Attributes API
モデル内にattributeでカラム名とその型を記述することで、RDBMS上のテーブルで定義された型とは違った型として振る舞いの定義を変更できます。
全てのモデルはApplicationRecordを継承
以前のRailsでは、ジェネレーターによって生成されるモデルファイルはActiveRecord::Baseを継承元としていました。Rails 5からは全てのモデルはActiveRecord::Baseを継承したapp/models/application_record.rbに定義されているApplicationRecordを継承するようになりました。
in_batchesメソッド
これまで大きなモデルデータを処理する場合、find_in_batchesメソッドを使用していました。しかし、このメソッドはブロックに配列で渡すためメモリ効率があまりよくありません。
Rails 5で用意されたin_batchesメソッドはブロックにActiveRecord::Relationを渡すため、より効率的に大量データを処理できるようになっています。
or,left_outer_joins,left_joinsメソッド
これまではSQL文のorに該当するアクセスコードがありませんでしたが、Rails 5で追加となっています。同様にleft outer joinに該当するアクセスコードが追加となりました。なお、left_joinsはleft_outer_joinsのエイリアスなので同じ動作となります。
その他の変更点
さらに、Rails 5で変更が加えられた点についてハイライトをピックアップしてご紹介します。
rakeタスクをrailsコマンドから実行可能に
Railsではバッチ処理をつかさどるrakeタスクという仕組みが提供されています。rakeコマンドの組み合わせでなんらかのバッチ処理を実行可能です。
一方でrailsコマンドもあり、rakeコマンドとrailsコマンドとの棲み分けが分かりづらくなっていた背景がありました。これを解決するために、これまでrakeコマンドで実行していたものはすべて、railsコマンドで代替可能となりました。
Turbolinks 5
Turbolinksとは、ページ遷移をAjax化しJavaScriptやCSSなどのパースを省略することで高速化する機能です。Rails 4からデフォルトで搭載されるようになっています。
Turbolinks 5では、ページ間で固定したいDOM要素にはdata-turbolinks-permanentを付与し、ページ間で固定しないDOM要素にはdata-turbolinks-temporaryを付与することで、より高速化が期待できます。
これまでTurbolinksはRailsはデフォルトで採用しているものの、JavaScriptとの相性の関係から各種チュートリアルなどでは「Turbolinksをオフにします」などとの記述を目にすることが多く、不遇の扱いを強いられていました。しかし、公式HPでは、iOS・Androidのネイティブアプリと遜色ない動きが期待できるとうたわれています。