3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsアーキテクチャ:MVC/Hotwire/Inertia.js/API分離のまとめ

3
Last updated at Posted at 2025-12-30

概要

Railsの主要アーキテクチャを2025年12月時点でまとめてみました
MVC, Hotwire, Inertia.js, API分離をベースに記述しています
余談ですが、Serviceクラスを使うべきかの議論についても記述しました

1. Rails標準: MVC (Model–View–Controller)

  • RailsではMVCを中心とした「サーバレンダリング+HTML」返却がデフォルトです
  • ルーティング → コントローラ → モデル → ビュー の流れでHTMLを返すのが基本
    • Skinny Controllers / Fat Models(肥大化は避けつつもロジックはモデル中心へ)
    • スコープ・バリデータ・フォームオブジェクト・Queryオブジェクトなどで整理されたモデル構造が理想
  • 複雑化時にServiceへ追い出す前にまずModelを整えるのがRailsの基本思想

近年は「Fat Modelを推奨する」よりも
“Well-structured Models”に整理するアプローチが重要
→ Domain/Value Object等を適宜導入し、責務の明確化を図る

  • Form Object(入力・更新のためのロジック整理)
  • Query Object(複雑な検索条件の切り出し)
  • Value Object(値・属性の不変条件を保持)
  • Service Object(複数モデル・外部APIを跨ぐ際)

ケース

  • CRUD中心で実装する場合
  • フロントエンドの複雑さを増やしたくない場合

2. Hotwire(Turbo + Stimulus):Railsだけで“ほぼSPA体験”を作る

  • Hotwireは“HTML Over The Wire”という思想で、SPAのような体験をRails中心で実現できる
  • 中心はTurbo(Drive/Frames/Streams)とStimulus(軽量JS)で、React/Vueを使わずに現代的なUI体験を構築できる
  • Rails 7以降での統合が進み、Rails 8でも有力な選択肢
    • Turbo Drive:リンク/フォームを高速化(<body>差し替え・<head>維持)。SPA的な遷移
    • Turbo Frames:<turbo-frame>内を部分更新
    • Turbo Streams:複数DOM同時更新・リアルタイム(ActionCableと相性◎)
    • Stimulus:必要最小限のJSでインタラクション付与

フルSPAではない
サーバ駆動UIが中心。複雑な状態管理には設計に工夫が必要

長所

  • React/VueなしでUX向上
  • サーバサイド中心で開発速度が高い
  • Turbo StreamsでリアルタイムUIが容易

注意点(弱点)

  • 状態管理の複雑なUIには不向き
  • JSが増えてくると保守性が落ちやすい
  • 大規模SPA用途ではInertia/API分離の方が合うことも

ケース

  • RailsだけでUI改善・高速化したい
  • リアルタイム更新・部分更新を入れたい
  • API分離ほどの設計コストはかけたくない

3. Inertia.js + Rails(inertia-rails):APIレスでReact/VueなどをView層に

  • Inertiaはコントローラから props を返し、ViewをReact/Vueなどで描画する仕組み
  • ルーティング・認証・セッションはRailsをそのまま活用できます

特徴

  • API不要(JSON設計・CORSやBFFなし)でSPA的に動作
  • Railsのルーティングを継続しつつReact/Vue等のコンポーネントへ描画
  • SSRは現状実験段階(2025年時点)

利点

  • HotwireよりリッチなUIを構築可能
  • React/Vueの資産・知見を活かせる
  • フロント専任が多いチームで親和性高い

注意点

  • 内部は完全SPAではない(サーバルート依存)
  • UI規模が大きくなると状態管理や最適化は普通のSPA同様に必要
  • モバイルアプリや外部サービス連携が増えると
  • → 結局API化が必要になることも多い

ケース

  • React/Vueで開発しつつRailsの恩恵(ルーティング/認証)も維持したい
  • APIを完全に切り離すほどの規模ではない
  • SPA体験のコストを下げたい

参考サイト

4. APIモード+SPA分離(Rails API + React/Vue.js/Angular)

  • RailsをAPI専用(--api)とし、フロントを完全に別リポジトリで構築するアプローチ

長所

  • Next.js/Vite等のモダン技術をフル活用
  • SSR/SSG/Island Architectureなども取れる
  • モバイル・複数フロント統合・GraphQL化に強い

短所

  • 認証・CORS・デプロイが複雑化
  • RailsによるUI開発の強みを失う
  • API管理が必要

5. アーキテクチャ一覧

目的 / 状況 選択肢
Rails完結でUI改善・高速化、リアルタイム要件あり HHotwire (Turbo + Stimulus)
React/Vueを使いつつAPI設計を省きたい Inertia.js + Rails
SSR/SSGやネイティブ併用、自由なフロント構成が必要 Rails API + SPA

6. 余談: Serviceクラスは非推奨なのか?

  • RailsコミュニティではService Objectsに肯定/慎重の両論があります

肯定派:

  • 複雑な業務ロジックを1箇所に集約できる
  • 外部API連携・課金処理などで効果的
  • テスト容易性が高い

慎重派:

  • 乱立すると責務境界が不明瞭
  • “なんでもServiceに投げる”と迷走しやすい
  • まずModel整理し、補助的に導入するのが本来の姿

実務的な判断軸

  • 単一モデル内の業務ルール
    • → Model / バリデータ / スコープ / ValueObject で十分
  • 複数モデル横断 / 外部API処理 / 取引・課金
    • Serviceでトランザクション制御・例外処理を集約

参考サイト

【参加レポート】Kaigi on Rails 2025で学んだRails開発の実践知

6. 用語説明

  • MVC:Rails標準の層分離
  • Hotwire:HTMLベースで高速UI、部分更新/リアルタイムに強い
  • Turbo Drive / Frames / Streams:UI更新方式
  • Inertia.js:APIレスでReact/VueをView層に
  • Service Object:複数モデル・外部連携など高凝集ロジックを切り出すパターン
  • ActionCable:WebSocketリアルタイム通信

7. まとめ

  • Railsの選択肢
    • 小規模CRUD → MVCが最速
    • UIリッチにしたいがRails中心で進めたい → Hotwire
    • React/Vueの生産性も欲しい → Inertia.js
    • Web/Native/複数サービス展開・拡張性重視 → API + SPA
  • Service Objectの扱いは宗教論ではなく設計判断
  • 責務を分離し、やりたい事に合わせてアーキテクチャを考えることが大事
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?