💨

RailsにおけるCoC(Convention over Configuration)を具体例で理解しよう

に公開

はじめに

Rails学習を始めると必ず耳にする「CoC(Convention over Configuration)」。
「設定よりも規約」と訳されますが、具体的にどういうことなのか、初学者の方にはピンと来ないかもしれません。

この記事では、Railsの具体例を通してCoCの概念を分かりやすく解説します。

CoCとは何か?

CoC(Convention over Configuration) = 「設定よりも規約」

簡単に言うと

  • 規約(命名規則やファイル配置)に従えば、設定ファイルを書かなくても動く
  • 開発者が覚えることが減り、開発速度が上がる

1. モデルとテーブルの関係

規約に従った場合

# app/models/user.rb
class User < ApplicationRecord
end

Railsは自動的に以下を推測します

  • モデル名:User(単数形)
  • テーブル名:users(複数形)
  • 主キー:id
# これだけでusersテーブルにアクセスできる
user = User.create(name: "田中太郎", email: "tanaka@example.com")
users = User.all

もし規約がなかったら...

# 設定ファイルで全部指定する必要がある(他のフレームワークの例)
class User < ApplicationRecord
  self.table_name = "users"
  self.primary_key = "id"
end

# さらに設定ファイル(config/database_mapping.yml など)
user_model:
  table: users
  primary_key: id
  fields:
    name: string
    email: string

2. コントローラとアクション

規約に従った場合

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
  
  def show
    @user = User.find(params[:id])
  end
end

Railsは自動的に以下を推測します

  • コントローラ名:UsersController
  • 対応するビューディレクトリ:app/views/users/
  • indexアクション → app/views/users/index.html.erb
  • showアクション → app/views/users/show.html.erb

ファイル構造

app/
├── controllers/
│   └── users_controller.rb
├── models/
│   └── user.rb
└── views/
    └── users/
        ├── index.html.erb
        └── show.html.erb

3. ルーティング

規約に従った場合

# config/routes.rb
Rails.application.routes.draw do
  resources :users  # この1行だけ!
end

これだけで以下のルートが自動生成されます:

HTTPメソッド パス アクション 用途
GET /users index 一覧表示
GET /users/new new 新規作成フォーム
POST /users create 新規作成
GET /users/:id show 詳細表示
GET /users/:id/edit edit 編集フォーム
PATCH/PUT /users/:id update 更新
DELETE /users/:id destroy 削除

もし規約がなかったら...

# 全てのルートを手動で定義する必要がある
Rails.application.routes.draw do
  get    '/users',          to: 'users#index'
  get    '/users/new',      to: 'users#new'
  post   '/users',          to: 'users#create'
  get    '/users/:id',      to: 'users#show'
  get    '/users/:id/edit', to: 'users#edit'
  patch  '/users/:id',      to: 'users#update'
  put    '/users/:id',      to: 'users#update'
  delete '/users/:id',      to: 'users#destroy'
end

4. データベースマイグレーション

規約に従った場合

# マイグレーションファイル生成
rails generate migration CreateUsers name:string email:string

生成されるファイル

# db/migrate/20231201120000_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email
      
      t.timestamps  # created_at, updated_atが自動追加
    end
  end
end

Railsが自動的に

  • テーブル名をusersと推測
  • idカラムを主キーとして自動追加
  • created_atupdated_atを自動追加

5. アソシエーション(関連)

規約に従った場合

# app/models/user.rb
class User < ApplicationRecord
  has_many :posts  # 複数の投稿を持つ
end

# app/models/post.rb
class Post < ApplicationRecord
  belongs_to :user  # ユーザーに属する
end

Railsは自動的に推測します

  • postsテーブルにuser_idカラムがある
  • User.find(1).postsで関連する投稿を取得
  • Post.find(1).userで投稿者を取得

データベースの構造

-- users テーブル
id | name | email | created_at | updated_at

-- posts テーブル  
id | title | content | user_id | created_at | updated_at

6. パーシャル(部分テンプレート)

規約に従った場合

<!-- app/views/users/index.html.erb -->
<h1>ユーザー一覧</h1>

<% @users.each do |user| %>
  <%= render user %>  <!-- この1行だけ! -->
<% end %>
<!-- app/views/users/_user.html.erb -->
<div class="user">
  <h2><%= user.name %></h2>
  <p><%= user.email %></p>
</div>

Railsが自動的に

  • render user_user.html.erbパーシャルを探す
  • user変数をパーシャルに渡す

CoCのメリット

1. 開発速度の向上

# 設定を書く時間が不要
# この3行で基本的なCRUDが完成
rails generate scaffold User name:string email:string
rails db:migrate
# 完成!

2. 学習コストの削減

  • 規約を覚えれば、どこに何を書けばいいか迷わない
  • チーム開発でも統一された構造

3. エラーの削減

  • 設定ファイルの記述ミスがない
  • タイポによるバグが減る

CoCの注意点

規約に従えない場合は明示的に設定

# テーブル名を変更したい場合
class User < ApplicationRecord
  self.table_name = "members"  # usersではなくmembersテーブルを使用
end

# 外部キー名を変更したい場合
class Post < ApplicationRecord
  belongs_to :author, class_name: "User", foreign_key: "author_id"
end

まとめ

RailsのCoCは

  1. 命名規則に従うだけで設定不要

    • モデル:単数形、テーブル:複数形
    • コントローラ:複数形 + Controller
  2. ファイル配置規約で自動認識

    • models、controllers、viewsディレクトリ
    • パーシャルは_から始まる
  3. RESTful設計が標準

    • resources :usersで7つのアクション自動生成
  4. 必要に応じて設定で上書き可能

    • 規約に従えない場合は明示的に設定

CoCを理解することで、Railsの「魔法」が実は理にかなった規約に基づいていることが分かります。
初学者の方は、まず規約に従って開発することから始めて、徐々にカスタマイズを覚えていくのがおすすめです!


参考になったら、ぜひ「いいね」をお願いします!

Discussion