Rack middleware development, configuration, and integration patterns. Use when working with middleware stacks or creating custom middleware.
View on GitHubgeoffjay/claude-plugins
ruby-sinatra-advanced
January 20, 2026
Select agents to install to:
npx add-skill https://github.com/geoffjay/claude-plugins/blob/main/plugins/ruby-sinatra-advanced/skills/rack-middleware/SKILL.md -a claude-code --skill rack-middlewareInstallation paths:
.claude/skills/rack-middleware/# Rack Middleware Skill
## Tier 1: Quick Reference - Middleware Basics
### Middleware Structure
```ruby
class MyMiddleware
def initialize(app, options = {})
@app = app
@options = options
end
def call(env)
# Before request
# Modify env if needed
# Call next middleware
status, headers, body = @app.call(env)
# After request
# Modify response if needed
[status, headers, body]
end
end
# Usage
use MyMiddleware, option: 'value'
```
### Common Middleware
```ruby
# Session management
use Rack::Session::Cookie, secret: ENV['SESSION_SECRET']
# Security
use Rack::Protection
# Compression
use Rack::Deflater
# Logging
use Rack::CommonLogger
# Static files
use Rack::Static, urls: ['/css', '/js'], root: 'public'
```
### Middleware Ordering
```ruby
# config.ru - Correct order
use Rack::Deflater # 1. Compression
use Rack::Static # 2. Static files
use Rack::CommonLogger # 3. Logging
use Rack::Session::Cookie # 4. Sessions
use Rack::Protection # 5. Security
use CustomAuth # 6. Authentication
run Application # 7. Application
```
### Request/Response Access
```ruby
class SimpleMiddleware
def initialize(app)
@app = app
end
def call(env)
# Access request via env hash
method = env['REQUEST_METHOD']
path = env['PATH_INFO']
query = env['QUERY_STRING']
# Or use Rack::Request
request = Rack::Request.new(env)
params = request.params
# Process request
status, headers, body = @app.call(env)
# Modify response
headers['X-Custom-Header'] = 'value'
[status, headers, body]
end
end
```
---
## Tier 2: Detailed Instructions - Advanced Middleware
### Custom Middleware Development
**Request Logging Middleware:**
```ruby
require 'logger'
class RequestLogger
def initialize(app, options = {})
@app = app
@logger = options[:logger] || Logger.new(STDOUT)
@skip_paths = options[:skip_paths] || []
end