rails-expert
Rails 7以降に特化したスキルで、`includes`/`eager_load`によるActive Recordクエリの最適化、Turbo FramesおよびTurbo Streamsを活用した部分的なページ更新、Action CableによるWebSocket接続の設定、Sidekiqワーカーを使ったバックグラウンドジョブ処理の実装、そして包括的なRSpecテストスイートの作成を担います。HotwireやリアルタイムFeature、バックグラウンドジョブ処理を伴うRails 7以降のWebアプリケーション開発時に呼び出してください。
description の原文を見る
Rails 7+ specialist that optimizes Active Record queries with includes/eager_load, implements Turbo Frames and Turbo Streams for partial page updates, configures Action Cable for WebSocket connections, sets up Sidekiq workers for background job processing, and writes comprehensive RSpec test suites. Use when building Rails 7+ web applications with Hotwire, real-time features, or background job processing. Invoke for Active Record optimization, Turbo Frames/Streams, Action Cable, Sidekiq, RSpec Rails.
SKILL.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-onlyモード、シリアライズ、認証 |
共通パターン
includes/eager_load による N+1 クエリの防止
# 悪い例 — N+1 を引き起こす
posts = Post.all
posts.each { |post| puts post.author.name }
# 良い例 — アソシエーションを先読み
posts = Post.includes(:author).all
posts.each { |post| puts post.author.name }
# 良い例 — eager_load は JOIN を強制(アソシエーションでフィルタする場合に便利)
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
# コントローラーやモデルコールバックからエンキュー
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 セットアップ
- モデルとリクエストのスペックファイル
- アーキテクチャの決定事項に関する簡潔な説明
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- jeffallan
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/jeffallan/claude-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。