rails-expert について
rails-expertは、Railsアプリケーションを開発・保守するためのスキルです。段階的な作業手順、トピック別の資料、実装パターンに加え、テストとパフォーマンスの確認方法を示します。
主な機能
- 01Rails機能の開発手順
- 02HotwireとActive Recordのガイド
- 03バックグラウンドジョブとAPIの資料
- 04RSpecとRuboCopによる検証
- 05N+1クエリとインデックスの確認
活用シーン
- 01Railsリソースの計画と実装
- 02Hotwire画面のパターン選定
- 03マイグレーションや失敗テストの調査
- 04クエリ性能とインデックスの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill rails-expertインストール後、Claude Code で/rails-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/active-record.mdapi-development.mdbackground-jobs.mdhotwire-turbo.mdrspec-testing.md詳細
Rails Expert
基本的なワークフロー
- 要件を分析する — モデル、ルート、リアルタイム対応の必要性、バックグラウンドジョブを特定します
- リソースをスキャフォールドする —
rails generate model User name:string email:string、rails generate controller Users - マイグレーションを実行する —
rails db:migrateを実行し、rails db:schema:dumpでスキーマを確認します- マイグレーションに失敗した場合:
db/schema.rbを調べて競合を確認し、rails db:rollbackでロールバックしてから修正し、再試行します
- マイグレーションに失敗した場合:
- 実装する — コントローラーとモデルを作成し、Hotwire を追加します(下記のリファレンスガイドを参照)
- 検証する —
bundle exec rspecがパスする必要があります。スタイルチェックにはbundle exec rubocopを使用します- テストに失敗した場合:エラー出力を確認し、失敗した example を修正してから、詳細を確認するため
--format documentationを付けて再実行します - レビュー中に N+1 クエリが見つかった場合:
includes/eager_loadを追加し(「一般的なパターン」を参照)、テストを再実行します
- テストに失敗した場合:エラー出力を確認し、失敗した example を修正してから、詳細を確認するため
- 最適化する — N+1 クエリを監査し、不足しているインデックスを追加し、キャッシュを追加します
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| Hotwire/Turbo | references/hotwire-turbo.md | Turbo Frames、Streams、Stimulus コントローラーを使う場合 |
| Active Record | references/active-record.md | モデル、関連付け、クエリ、パフォーマンスを扱う場合 |
| バックグラウンドジョブ | references/background-jobs.md | Sidekiq、ジョブ設計、キュー、エラー処理を扱う場合 |
| テスト | references/rspec-testing.md | モデル/リクエスト/システムの spec、ファクトリーを扱う場合 |
| API 開発 | references/api-development.md | API 専用モード、シリアライズ、認証を扱う場合 |
一般的なパターン
includes/eager_load による N+1 の防止
# BAD — triggers N+1
posts = Post.all
posts.each { |post| puts post.author.name }
# GOOD — eager load association
posts = Post.includes(:author).all
posts.each { |post| puts post.author.name }
# GOOD — eager_load forces a JOIN (useful when filtering on association)
posts = Post.eager_load(:author).where(authors: { verified: true })
Turbo Frame の設定(ページの部分更新)
<%# app/views/posts/index.html.erb %>
<%= turbo_frame_tag "posts" do %>
<%= render @posts %>
<%= link_to "Load More", posts_path(page: @next_page) %>
<% end %>
<%# app/views/posts/_post.html.erb %>
<%= turbo_frame_tag dom_id(post) do %>
<h2><%= post.title %></h2>
<%= link_to "Edit", edit_post_path(post) %>
<% end %>
# app/controllers/posts_controller.rb
def index
@posts = Post.includes(:author).page(params[:page])
@next_page = @posts.next_page
end
Sidekiq Worker のテンプレート
# app/jobs/send_welcome_email_job.rb
class SendWelcomeEmailJob < ApplicationJob
queue_as :default
sidekiq_options retry: 3, dead: false
def perform(user_id)
user = User.find(user_id)
UserMailer.welcome(user).deliver_now
rescue ActiveRecord::RecordNotFound => e
Rails.logger.warn("SendWelcomeEmailJob: user #{user_id} not found — #{e.message}")
# Do not re-raise; record is gone, no point retrying
end
end
# Enqueue from controller or model callback
SendWelcomeEmailJob.perform_later(user.id)
Strong Parameters(コントローラーのテンプレート)
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_action :set_post, only: %i[show edit update destroy]
def create
@post = Post.new(post_params)
if @post.save
redirect_to @post, notice: "Post created."
else
render :new, status: :unprocessable_entity
end
end
private
def set_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :body, :published_at)
end
end
制約
必ず行うこと
- 関連付けを含むすべてのコレクションクエリで
includes/eager_loadを使い、N+1 クエリを防止します - カバレッジ 95% 超を目標に、網羅的な spec を作成します
- 複雑なビジネスロジックにはサービスオブジェクトを使い、コントローラーは薄く保ちます
WHERE、ORDER BY、またはJOINで使われるすべてのカラムにデータベースインデックスを追加します- 時間のかかる処理は Sidekiq にオフロードし、リクエスト処理中に同期実行しないでください
絶対に行わないこと
- スキーマ変更に対するマイグレーションを省略する
- サニタイズせずに生の SQL を使う(
sanitize_sqlまたはプレースホルダー付きクエリのみ使用してください) - 十分に検討せずに URL で内部 ID を公開する
出力テンプレート
Rails の機能を実装するときは、次を提示します。
- マイグレーションファイル(スキーマ変更が必要な場合)
- 関連付けとバリデーションを含むモデルファイル
- RESTful アクションと Strong Parameters を備えたコントローラー
- ビューファイルまたは Hotwire の設定
- モデルとリクエストの spec ファイル
- アーキテクチャ上の判断に関する簡潔な説明
Synergetic Solutions のプリンシパルコンサルタント、@jeffallan がメンテナンスしています
コメント
Markdown 対応