ベンチャーではRubyでWEBアプリを開発することが多いと思います。
バックエンドのフレームワークのひとつにRuby on Railsがあります。
0.はじめに
Ruby on Rails開発のスキルセットには何が必要だろう?!そんな疑問にお答えするべく、今回は、Ruby on Rails開発についてご紹介します。
Ruby on Railsは設定より規約を重視する思想が色濃く反映されたフレームワークです。10人以下の少人数開発など少数精鋭で、システム全体を把握しながら開発を楽しめる傾向から、日本で愛されている言語・フレームワークです。
Rails8からRails回帰が進んできております。既にRails5からAPIモードも構築でき、フロントエンドからインフラ構成までRailsを中心にシンプルに構築できるようになりました。
Ⅰ.Ruby on Rails
1-1. 開発手法
Ruby on Railsには、HTMLテンプレートを用いてサーバーサイドでレンダリングを行うフルスタック開発と、Vue.jsやReact.jsとJSON通信するAPIモード開発があります。
- ビュー(View)では、マークアップ言語内にRubyのコードを埋め込むERBテンプレートエンジン、あるいはHamlやSlimなどのテンプレートエンジンを使います。
- モデル(Model)では、ActiveRecordを介してデータベースを操作します。小規模から、データベース分割(Sharding)を用いた大規模アプリまで、Railsの機能を活かした柔軟な設計が可能です。
- コントローラー(Controller)では、リクエストを受け取り、モデルを介してデータを更新し、レスポンスを返すアクションを記述します。
1-2. ビュー(View)
Rails 7およびRails 8におけるView開発は、W3C規格やChrome / Edgeなどの登場により、jQueryやWebpackにてビルド時に固める必要あった時代から、ファイルを個別にユーザーに届けてもES Modules等によりブラウザ側で効率的にレンダリングできるモダンな時代となりました。
【構成①】Hotwire × Importmap
- Importmap は Rails 7/8のデフォルト構成です。Webpackやesbuildのようなビルドやコンパイルの工程を必要としません。Hotwireでは、SPA風の動きとして部分更新をTurboが担い、DOM 操作やイベントハンドリングはStimulusが担います。
【構成②】Inertia.js × jsbundling-rails
- Inertia.js および jsbundling-rails を採用することで、Railsの世界に、ReactやVueの型安全でリッチなUI開発を統合できます。フロントエンドのビルドを伴いますが、ルーティングや認証をRails標準で組むことができ、SPA開発とRailsの生産性を両立できます。
【構成③】Next.js × Rails APIモード
- Rails APIモードとは、Railsを純粋なAPIサーバーとする構成です。バックエンドとフロントエンドを完全に分離するヘッドレスRailsのアーキテクチャです。主に大規模開発時、フロントエンドチームとバックエンドチームとを分ける際に選択します。
1-3. モデル(Model)
ActiveRecord
- Ruby on Railsでのデータベース操作は、ActiveRecordを用いることで、SQLを意識することなくデータアクセスするプログラムを扱うことができます。
- マイグレーションファイルにより、テーブルの追加・変更を管理し、ActiveRecordメソッドを実行することでデータベースの変更を指示できます。
- テーブル間のリレーションは、belongs_to、has_many(1:n)、has_one(1:1)、has_many through(n:m)などのアソシエーションで定義します。これにより複数テーブルのデータ操作も効率的に扱えます。
- また、不正なデータを防ぐバリデーションや、保存・更新等のタイミングで特定の処理を実行するコールバックを実装し、データの整合性を保ちます。
1-4. コントローラ(Controller)
ルーティング
- CRUD(作成、読込、更新、削除)機能のルーティングを「config/routes.rb」に定義し、コントローラーのアクションへ割り当てます。
認証
- Rails 8は、
bin/rails generate authenticationコマンドにより、標準で認証の雛形を生成可能です。外部Gemのdeviseに頼らずにセキュア認証を実装できます。
REST設計
- RESTの原則に基づき、GET、POST、PUT、PATCH、DELETE を基本としたリソース操作のURIを構築します。
API-JSON形式
- APIモードでは、データベースから取得したデータを
render json:メソッド等を使ってJSON形式で返却するコントローラーを開発します。
1-5. バッチ
非同期処理
- Rails8からはSolid Queue等の「Solid三銃士」が登場し、外部GemやRedisに頼らずにRails標準で非同期処理やキャッシュを実装できます。以前はSidekiqとRedisを必要としてきましたが、Rails8からはRDB(SQLiteやPostgreSQL等)でこれらを完結できるため、インフラ構成を非常にシンプルに保てます。
Ⅱ.RSpec
2-1. 単体試験
コンポーネントテスト(Component Test)
- GitHub提唱のViewComponent等を導入した場合、UI単位での「ViewComponent Spec」をコーディングできます。部品単位で再利用性とテスト容易性を高めます。
単体テスト(Unit Test)
- 「Model Spec」などで関数が想定通り動作するか検証します。モデルや共通メソッドの開発では自動テストを導入し、リモートリポジトリへのプッシュ時にCI(継続的インフラ)上で自動実行させることが一般的です。
2-2. 結合試験
結合テスト(Integration Test)
- RSpecにて、コントローラーやAPIの挙動を確認する「Request Spec」を記述します。HTTPリクエストを発行し、レスポンスの内容やステータスコードが想定通りか検証します。
統合テスト(E2E Test)
- ブラウザの挙動をシミュレートする「System Spec」をコーディングできます。ユーザーの実際の操作フローに沿って、画面遷移や表示内容が正しいかを自動テストで検証します。
2-3. テストデータ
FactoryBot
- テストデータの作り方としてFactoryBotにてサンプルユーザーをつくることが一般的です。UT単体試験やIT結合試験だけでなく、ST総合試験のような全機能テストを行う際にも、テストデータをFactoryBotでつくりテストします。
2-4. チーム開発
VSCode
- VSCodeのデバッグは現在、Rails標準の
debugのGemが推奨されます。コードにbinding.breakを追記すれば、処理を一時停止しターミナル上で変数確認やステップ実行が可能。 さらに拡張機能の「VS Code Ruby Debugger」を使えば、エディタ上のクリックでブレークポイントを設置でき、GUI上で直感的にデバッグが行えます。
RubyMine
- JetBrains社の有償IDEであるRubyMineでは、binding.pry等を追記しなくとも、行番号の隣をクリックしてブレークポイントを設置するだけで、高度なデバッグ機能が即座に利用できます。
Docker
- 開発環境はDockerでコンテナ化し、VSCodeの「Dev Containers」機能等を用いて、OSに依存せず統一された環境にて開発を行います。
GitHubFlow
- ソース管理はGit/GitHubを用います。GitHub Flowでは、mainブランチからfeatureブランチを切り出して開発します。開発後にプッシュし、プルリクエストを通じてコードレビューを行い、承認後にマージする流れが一般的です。
Ⅲ.まとめ
Ruby on Railsは進化を続けており、最新のRails 8では標準機能が大幅に拡充されました。フロントエンドからインフラまでRailsを中心に据えることで、非常に高い生産性を実現できます。 開発生産性を最大化できるRuby on Railsは、ベンチャー企業における有力な技術選定の候補です。
グロシードでは顧客要件を実現するRuby on Rails開発に取り組んでおります。 フルスタックな開発から、モダンなフロントエンドと組み合わせたAPI開発まで、幅広く注力しております。
◆関連募集
バックエンドエンジニア募集中でございます。こちらも見ていただけましたら幸いです。
▼開発エンジニア |流通 × SES| 広告/店舗/EC/販促/物流/基幹
https://www.wantedly.com/projects/2304419