rails-controller-patterns

Rails controller patterns and conventions. Automatically invoked when working with controllers, routes, strong parameters, before_actions, or request handling. Triggers on "controller", "action", "routes", "routing", "strong params", "params.expect", "before_action", "respond_to", "RESTful", "CRUD", "redirect", "render".

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "rails-controller-patterns" with this command: npx skills add ag0os/rails-dev-plugin/ag0os-rails-dev-plugin-rails-controller-patterns

Rails Controller Patterns

Patterns for building well-structured Rails controllers.

When This Skill Applies

  • Implementing RESTful controller actions
  • Handling request parameters safely
  • Setting up before_action filters
  • Managing response formats
  • Designing routes
  • Error handling in controllers

Core Principles

Thin Controllers

Controllers should:

  • Handle HTTP concerns (params, session, response)
  • Delegate business logic to models/services
  • Keep actions under 10 lines

RESTful Design

Stick to standard CRUD actions:

  • index, show, new, create, edit, update, destroy
  • Add custom actions sparingly

Detailed Documentation

Controller Structure

class PostsController < ApplicationController
  # 1. Before actions
  before_action :authenticate_user!
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  # 2. Actions (CRUD order)
  def index
    @posts = Post.recent.page(params[:page])
  end

  def show
  end

  def new
    @post = current_user.posts.build
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      redirect_to @post, notice: 'Post created.'
    else
      render :new, status: :unprocessable_entity
    end
  end

  def edit
  end

  def update
    if @post.update(post_params)
      redirect_to @post, notice: 'Post updated.'
    else
      render :edit, status: :unprocessable_entity
    end
  end

  def destroy
    @post.destroy
    redirect_to posts_path, notice: 'Post deleted.'
  end

  private

  # 3. Private methods
  def set_post
    @post = current_user.posts.find(params[:id])
  end

  def post_params
    params.expect(post: [:title, :content, :published])
  end
end

Strong Parameters (Rails 8+)

# Rails 8+ syntax with expect
def post_params
  params.expect(post: [:title, :content, tags: []])
end

# Nested attributes
def user_params
  params.expect(user: [:name, :email, profile_attributes: [:bio, :avatar]])
end

# Traditional permit (still works)
def post_params
  params.require(:post).permit(:title, :content, tags: [])
end

Quick Reference

ActionHTTP VerbPathPurpose
indexGET/postsList all
showGET/posts/:idShow one
newGET/posts/newForm for new
createPOST/postsCreate
editGET/posts/:id/editForm for edit
updatePATCH/PUT/posts/:idUpdate
destroyDELETE/posts/:idDelete

Key Conventions

  • Use redirect_to after successful changes
  • Use render :action, status: :unprocessable_entity for validation failures
  • Return appropriate HTTP status codes
  • Keep private methods minimal

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

ruby refactoring expert

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

hotwire-patterns

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

rails-model-patterns

No summary provided by upstream source.

Repository SourceNeeds Review