【Ruby on Rails】MVCとRailsのディレクトリ構成を理解する

Ruby

こんにちは、かつコーチです。

rails newでフォルダはできたけど、どこに何を書けばいいのか分からない」。
Rails初心者が最初にぶつかる壁の一つです。
この記事では、Railsの設計の土台となるMVCという考え方と、実際のディレクトリ構成の対応関係を解説します。
読み終える頃には、フォルダを見ただけで「ここに何を書けばいいか」が分かるようになります。

MVCとは?

データ・画面・制御を分ける設計パターン

MVCとは、Model(モデル)・View(ビュー)・Controller(コントローラ)の頭文字を取った設計パターンです。
アプリケーションの処理を、次の3つの役割に分けて整理する考え方です。

  • Model:データベースとのやり取りやデータのルールを担当する
  • View:ユーザーに見せる画面(HTML)を担当する
  • Controller:ユーザーからのリクエストを受け取り、ModelとViewをつなぐ役割を担当する

Railsはこの3つの役割ごとにファイルを配置する場所が決まっています。
これもRails1本目の記事で紹介した「設定より規約(CoC)」の一部です。

なぜ役割を分ける必要があるのか

もし画面の処理・データの処理・制御の処理を1つのファイルにまとめて書いてしまうと、コードはあっという間に読みにくくなります。
機能を追加するたびに、どこに何が書いてあるか探すのに時間がかかってしまうためです。

MVCで役割を分けておくと、次のようなメリットがあります。

  • 「画面を直したいならView」「データの扱いを直したいならModel」と迷わず探せる
  • 複数人での開発でも、担当箇所がぶつかりにくい
  • テストを書くときも、役割ごとに分けてテストしやすい

app/配下のディレクトリ構成

モデル:app/models

app/modelsには、データベースのテーブルと対応するモデルのファイルを置きます。
データの検証(バリデーション)や、テーブル同士の関連(アソシエーション)もここに書きます。

# app/models/post.rb
class Post < ApplicationRecord
  validates :title, presence: true
end

このモデルは、postsテーブルと自動的に対応づけられます。
validates :title, presence: trueは「タイトルは必ず入力する」というルールを設定している部分です。

ビュー:app/views

app/viewsには、ユーザーに表示する画面のテンプレートを置きます。
Railsでは標準でERB(Embedded Ruby)という形式のファイルを使います。
拡張子は.html.erbです。

<!-- app/views/posts/index.html.erb -->
<h1>投稿一覧</h1>
<ul>
  <% @posts.each do |post| %>
    <li><%= post.title %></li>
  <% end %>
</ul>

<% %>で囲んだ部分にRubyのコードを書き、<%= %>で囲んだ部分は値を画面に出力します。
ERBの詳しい書き方は、別の記事「ビュー(ERB)の基本とレイアウト」で解説予定です。

コントローラ:app/controllers

app/controllersには、ユーザーからのリクエストを受け取って処理するコントローラを置きます。
Modelからデータを取得し、Viewに渡す橋渡し役です。

# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end

indexのようなメソッドをアクションと呼びます。
コントローラとアクションについては、次の記事「コントローラの基本:アクションとストロングパラメータ」で詳しく解説します。

その他の主要フォルダの役割

config:設定ファイル

configフォルダには、ルーティングやデータベース接続などの設定ファイルをまとめて置きます。
特にconfig/routes.rbは、URLとコントローラの対応関係を定義する重要なファイルです。
ルーティングの詳細は次回の記事で扱います。

db:マイグレーションとスキーマ

dbフォルダには、テーブルの作成・変更履歴を記録するマイグレーションファイルが保存されます。
db/schema.rbには、現在のデータベース構造がまとめて記録されています。

app/assets・public:静的ファイル

CSSや画像などの静的ファイルは、主にapp/assetsに置きます。
Rails 8ではデフォルトでPropshaftというアセット管理の仕組みが採用されています。

よくあるつまずきポイント・エラー対処

Before/After:ファイルの置き場所を間違えるケース

Rails初心者が特にやりがちなのが、モデルとコントローラの置き場所を間違えるミスです。
私自身も学習を始めた頃、コントローラ用のファイルをうっかりapp/modelsに置いてしまい、次のようなエラーに遭遇しました。

❌Before:コントローラをmodelsフォルダに置いてしまう

app/models/posts_controller.rb  ← 置き場所を間違えている

このままルーティングからアクセスしようとすると、次のエラーが表示されます。

uninitialized constant PostsController

Railsは「ファイルの置き場所」と「クラス名」の対応関係を規約で決めています。
app/controllersに置くべきファイルがapp/modelsにあると、Rails側がクラスを見つけられません。

✅After:正しいフォルダに配置する

app/controllers/posts_controller.rb  ← 正しい置き場所

Railsのファイルは「役割ごとのフォルダに、決まった命名規則で置く」というルールを徹底することが大切です。
迷ったときは「これはデータの話か、画面の話か、制御の話か」を考えると、置き場所を判断しやすくなります。

まとめ

この記事のポイント

  • MVCはModel・View・Controllerの3つに役割を分ける設計パターン
  • Modelはapp/models、Viewはapp/views、Controllerはapp/controllersに配置する
  • configは設定、dbはマイグレーションとスキーマの管理を担当する
  • ファイルの置き場所を間違えると、uninitialized constantのようなエラーが発生する

次に読むべき記事

MVCの全体像がつかめたら、次はURLとコントローラをつなぐ仕組みを学びましょう。
「ルーティングの基本:config/routes.rbの書き方」で、リクエストの入り口を理解してみてください。

タグ: Ruby on Rails, 初心者向け, 入門

タイトルとURLをコピーしました