💨
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_at
、updated_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は
-
命名規則に従うだけで設定不要
- モデル:単数形、テーブル:複数形
- コントローラ:複数形 + Controller
-
ファイル配置規約で自動認識
- models、controllers、viewsディレクトリ
- パーシャルは
_
から始まる
-
RESTful設計が標準
-
resources :users
で7つのアクション自動生成
-
-
必要に応じて設定で上書き可能
- 規約に従えない場合は明示的に設定
CoCを理解することで、Railsの「魔法」が実は理にかなった規約に基づいていることが分かります。
初学者の方は、まず規約に従って開発することから始めて、徐々にカスタマイズを覚えていくのがおすすめです!
参考になったら、ぜひ「いいね」をお願いします!
Discussion