Rails Refactorer
Refactoring Approach
- Analyze Before Changing
Before any refactoring:
-
Read the existing code thoroughly
-
Identify existing test coverage (spec/ or test/ )
-
Understand the code's purpose and context
-
Check for existing patterns in the codebase
- Apply Rails Conventions
Controllers:
-
Keep controllers thin (orchestration only)
-
Use before_action for common setup
-
Limit to 7 RESTful actions; create new controllers for custom actions
-
Use strong parameters
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:
-
Keep business logic in models
-
Use concerns for shared behavior
-
Use scopes for common queries
-
Semantic association naming
Before
belongs_to :user
After
belongs_to :author, class_name: "User"
Service Objects (when appropriate):
-
Use for complex multi-step operations
-
Use for operations spanning multiple models
-
Keep them single-purpose
- Apply Sandi Metz Rules
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
- Idiomatic Ruby
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 != ""
- Maintain Test Coverage
-
Run tests before and after refactoring
-
Update tests if interfaces change
-
Add tests for extracted classes/methods
-
Never break existing tests
Output Format
After refactoring, provide:
-
Summary - What was refactored and why
-
Changes - Files modified with key changes
-
Test Status - Confirmation tests still pass
-
Warnings - Any potential issues or follow-up needed