はじめに
WebアプリケーションフレームワークのRuby on Railsは、2021年12月にバージョン7となりました。これに伴い、クライアントサイド開発のサポートについても大きな変化を遂げ、多様な選択肢が提供されるようになりました。本連載では、このRails 7にフォーカスし、クライアントサイド開発のためのさまざまな機能を、API開発やリアルタイムWeb開発も絡めながら、紹介していきます。
対象読者
- Ruby on Railsを長らく使ってきた方
- 他のWebアプリケーション開発フレームワークを使ってきた方
- Railsにおけるフロントエンド開発に関心のある方
必要な環境
本記事のサンプルコードは、以下の環境で動作を確認しています。
-
macOS Ventura(13.0.1)
- Ruby 3.1.0p0
- Ruby on Rails 7.0.4
- Google Chrome 108
Ruby on Rails APIモード
Ruby on Rails APIモード(以降、APIモード)とは、RESTfulなAPI(Application Program Interface)いわゆるWebサービスの提供に特化したRailsの動作モードをいいます。このAPIモードにより、Webサービス提供のためのRailsアプリケーションを容易に開発できるようになっています。
[NOTE]RESTfulなAPIとは
RESTfulなAPIとは、RESTの原則に準拠して構築されたWebシステムの呼び出しインタフェースをいいます。RESTはREpresentational State Transferの略で、①アドレス可能性②ステートレス性③接続性④統一インタフェースの4つの原則から構成されます。わかりやすいURL、統一されたHTTPメソッドの使用などによって、サービスの提供側にも利用側にもメリットのある方式です。
なぜAPIモードか?
なぜAPIモードが特別に設けられているのでしょうか? 一つは、Webアプリケーションの開発においてフロントエンドとバックエンドを明確に切り離す動きが顕著であることです。
Facebook、TwitterなどのSNS、Amazonや楽天といったECサービスの利用において、PCではWebブラウザでの利用が一般的と思われますが、モバイル端末ではネイティブアプリケーションを利用することも多いと思われます。このような利用形態では、ビジネスロジックの処理はバックエンドに任せて、Webブラウザやネイティブアプリケーションではフロントエンドの処理に集中するというように役割分担するのが合理的です。
ただし、バックエンドとフロントエンドの境界が曖昧だと、非常に使いにくいものになってしまいます。このとき、バックエンドをWebサービスとして構成することで、フロントエンドに依存しない汎用的なWebシステムの構築が可能になります。
Railsでは、APIモードでバックエンドを構成し、別途Railsアプリケーションとして(Import MapsやReactを活用して)フロントエンドを構成する、といったことも可能になります。さらにWebサービス側では、内部のDBで処理を完結させても、さらに外部のWebサービスを利用してもよく、柔軟性がアップします。いずれにせよ、Webサービスのインタフェースが変わらない限り、フロントエンド側がそれを意識する必要はありません。APIモードを設けるということは、このようなシステム構成を採用するにあたり大きなアドバンテージとなります(図1)。
なぜRailsか?
もう一つは、通常のRailsアプリケーションの開発手法とリソースをほとんどそのまま活用できるという点です。APIモードといっても、それは通常のRailsアプリケーションからビューなどWebサービスでは不要なものを取り去っただけのものなので、開発手法に大きな違いは出ません。ルーティング、コントローラ開発、モデル開発、そしてActive xxxxやAction xxxxといったコンポーネントについても活用が可能です。本稿では取り上げていませんが、既存のアプリケーションを改変してAPIモード化することも可能です。
Webサービスでは、突き詰めればJSONやXMLといった形式のデータを提供できればいいので、Railsなどのフレームワークを使用しない、極論すればRubyやPHPなどのスクリプトをただ動かすだけのような実装も可能です。しかし、効率的な開発やテスト、それに運用管理も考慮すれば、Railsのようなフレームワーク上に構築した方が多くの恩恵を得られます。例えば、Railsでは以下のような機能がミドルウェアやAction Packなどのコンポーネントによって提供され、APIモードでも利用できます。
- 開発、テスト、本番環境の使い分け
- 基本的なセキュリティ機能
- カスタマイズ可能なログ出力
- ハッシュ化されたURLパラメータ(HTTPメソッドにかかわらずparamハッシュでパラメータにアクセスできる)
- 透過的な再読み込み(コードを書き換えたときに、サーバを再起動して再読み込みしたように振る舞わせることができる)
- 条件付きGET(stale?メソッドによってETagやLast-Modifiedを使ったリクエストを自動化する)
- HEADリクエストの透過的な変換(HEADリクエストをGETリクエストに透過的に変換することで確実に処理されるようにする)
- ルーティング、URL生成
- キャッシュの利用
- レスポンスヘッダやリダイレクトヘッダを容易に生成
- 認証機能
- ジェネレータ機能(Scaffoldingなど)