rails-expert について
Rails アプリケーションを開発・保守する開発者向けのスキルです。要件分析からスキャフォールディング、テスト、性能確認までを案内し、テーマ別の資料も備えています。
主な機能
- 01要件分析から検証までの手順
- 02Rails のスキャフォールディングとマイグレーション
- 03Hotwire と Active Record のガイド
- 04テストと性能の確認
- 05テーマ別のリファレンスファイル
活用シーン
- 01Rails の新機能を計画する
- 02マイグレーションやテストの失敗を調べる
- 03クエリの N+1 問題を確認する
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill rails-expertインストール後、Claude Code で/rails-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/active-record.mdapi-development.mdbackground-jobs.mdhotwire-turbo.mdrspec-testing.md詳細
Rails エキスパート
コアワークフロー
- 要件を分析する — モデル、ルート、リアルタイム要件、バックグラウンドジョブを特定します
- リソースをスキャフォールドする —
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を実行します- スペックに失敗した場合:エラー出力を確認し、失敗したサンプルを修正して、詳細を確認するために
--format documentationを指定して再実行します - レビュー中に N+1 クエリが見つかった場合:
includes/eager_loadを追加し(「一般的なパターン」を参照)、スペックを再実行します
- スペックに失敗した場合:エラー出力を確認し、失敗したサンプルを修正して、詳細を確認するために
- 最適化する — 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 | モデル/リクエスト/システムスペック、ファクトリーを扱う場合 |
| 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 ワーカーのテンプレート
# 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%を超えることを目標に、包括的なスペックを記述します
- 複雑なビジネスロジックにはサービスオブジェクトを使い、コントローラーは薄く保ちます
WHERE、ORDER BY、またはJOINで使われるすべてのカラムにデータベースインデックスを追加します- 時間のかかる処理は Sidekiq に委譲します。リクエスト処理中に同期実行してはいけません
禁止事項
- スキーマ変更のマイグレーションを省略しないでください
- サニタイズせずに生の SQL を使用しないでください(
sanitize_sqlまたはプレースホルダー付きクエリのみを使用します) - 十分に検討せずに内部 ID を URL に公開しないでください
出力テンプレート
Rails の機能を実装する際は、以下を提示します:
- マイグレーションファイル(スキーマ変更が必要な場合)
- 関連付けとバリデーションを含むモデルファイル
- RESTful アクションと Strong Parameters を備えたコントローラー
- ビューファイルまたは Hotwire のセットアップ
- モデルとリクエストのスペックファイル
- アーキテクチャ上の判断についての簡単な説明
コメント
Markdown 対応