From majestic-rails
Refactors Ruby on Rails code applying Rails conventions, Sandi Metz rules, and idiomatic Ruby patterns while maintaining test coverage. Use proactively during refactoring.
How this skill is triggered — by the user, by Claude, or both
Slash command
/majestic-rails:rails-refactorerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Before any refactoring:
Before any refactoring:
spec/ or test/)Controllers:
# Before: Custom action
class MessagesController < ApplicationController
def archive
@message = Message.find(params[:id])
@message.update(archived: true)
end
end
# After: Dedicated controller
class Messages::ArchivesController < ApplicationController
def create
@message = Message.find(params[:message_id])
@message.update(archived: true)
end
end
Models:
# Before
belongs_to :user
# After
belongs_to :author, class_name: "User"
Service Objects (when appropriate):
| Rule | Limit | Action |
|---|---|---|
| Class length | 100 lines | Extract classes |
| Method length | 5 lines | Extract methods |
| Parameters | 4 max | Use parameter objects |
| Controller objects | 1 | Use facades |
Prefer:
# Guard clauses
return unless user.active?
# Semantic methods
items.any?
email.present?
# Symbol to proc
users.map(&:name)
# Hash shorthand (Ruby 3.x)
{ name:, email: }
Avoid:
# Nested conditionals
if user
if user.active?
# ...
end
end
# Manual checks
items.length > 0
email != nil && email != ""
When refactoring involves migrations, review for production safety, data preservation, and reversibility.
Recommended gems:
# Gemfile
gem "strong_migrations" # Catches dangerous operations
gem "database_consistency" # Validates model <-> DB constraints
gem "anchor_migrations" # DDL lock timeout protection
# PROBLEM: Irreversible migration
def change
remove_column :users, :legacy_id
end
# SOLUTION: Explicit up/down with data preservation
def up
execute "CREATE TABLE legacy_user_ids AS SELECT id, legacy_id FROM users"
remove_column :users, :legacy_id
end
def down
add_column :users, :legacy_id, :integer
execute "UPDATE users SET legacy_id = (SELECT legacy_id FROM legacy_user_ids WHERE legacy_user_ids.id = users.id)"
end
# PROBLEM: Adding NOT NULL locks table
add_column :users, :status, :string, null: false
# SOLUTION: Three-step migration
add_column :users, :status, :string
User.update_all(status: 'active')
change_column_null :users, :status, false
# PROBLEM: Locks table during index creation
add_index :orders, :customer_id
# SOLUTION: Concurrent index (PostgreSQL)
disable_ddl_transaction!
add_index :orders, :customer_id, algorithm: :concurrently
| Operation | Risk | Safe Alternative |
|---|---|---|
| Change column type | Truncation | Add new column, migrate, drop old |
| Remove column | Data loss | Archive first, then remove |
| Rename column | App errors | Add + backfill + remove |
| Change precision | Data loss | Expand only, never contract |
algorithm: :concurrently?After refactoring, provide:
npx claudepluginhub majesticlabs-dev/majestic-marketplace --plugin majestic-railsProvides Ruby on Rails conventions, patterns, and best practices for ActiveRecord models, controllers, migrations, configuration, background jobs, logging, and request specs.
Guides writing new Ruby code with modern 3.x syntax, Sandi Metz's 4 rules for developers, and idiomatic best practices. Use for creating files, methods, or refactoring to ensure clarity, simplicity, and maintainability.
Delivers Ruby on Rails expertise: assesses projects, enforces conventions, optimizes ActiveRecord queries, implements Hotwire/Turbo/Stimulus, handles Sidekiq/Solid Queue jobs, and guides RSpec/FactoryBot testing.