Railsの「Rails way」とは、単なるルールではありません。**「Convention over Configuration(設定より規約)」と「Don't Repeat Yourself (DRY)」**を軸に、Railsが最も自然でメンテナンスしやすい形を自ら選ぶ「哲学」です。
2026年現在、Rails 8以降の進化により、Hotwire(Turbo 8 / Morphing)を中心とした新しい「王道」が確立されています。実務でよく見かけるアンチパターンと比較しながら、現代のRails Wayを解説します。
1. コントローラは「薄く・愚直に」 (Skinny Controller)
コントローラは「HTTPリクエストの交通整理」に徹するのがRails wayです。
✅ Rails way(おすすめ)
class PostsController < ApplicationController
def index
# Scopeを活用し、データ取得ロジックをモデル側に寄せる
@posts = Post.recent.with_rich_text_body.page(params[:page])
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to @post, notice: "投稿しました"
else
# 2026年標準: status 422 (unprocessable_entity) は必須
render :new, status: :unprocessable_entity
end
end
private
def post_params
params.require(:post).permit(:title, :body, :tag_list, images: [])
end
end❌ アンチパターン
- 手続き型コード: Post.new の後に1行ずつ属性を代入する。
- ビジネスロジックの混入: 保存前に複雑な条件分岐や、外部APIへの送信ロジックをコントローラに書く。
2. モデルは「賢く」させすぎない (Fat Modelの回避)
モデルにロジックを書きすぎると、テストが困難になり、再利用性が低下します。
✅ Rails way (2025–2026年流)
class Post < ApplicationRecord
include Searchable # 複雑な検索はQuery Objectへ逃がすが、入り口はモデル
belongs_to :user
has_rich_text :body
has_one_attached :cover_image
# 宣言的なバリデーションとスコープ
validates :title, presence: true, length: { maximum: 120 }
scope :recent, -> { order(created_at: :desc) }
# 状態変化に伴うリアルタイム更新 (Turbo 8)
broadcasts_refreshes
end❌ やりすぎアンチパターン
- 外部APIの直接呼び出し: after_create :send_to_twitter (→ Serviceオブジェクトへ)
- 表示用ロジック: def formatted_created_at (→ Decoratorへ)
