DEV Community

matt swanson
matt swanson

Posted on • Originally published at boringrails.com on

9 2

Sharing common code between Rails controllers with `Scoped` pattern

If you follow a strict REST / nested resources approach to building your Rails app, you might get sick of repeating common controller actions.

Try the Scoped concern pattern: a place to put shared code (setting variables, authorization) and slim down your controllers.

Usage

This particular pattern comes from DHH and Basecamp – a codebase that prides itself of using lots of tiny concerns to share bits of behavior.

While the savings of repeating the same before_actions to look up a Channel would be a fine benefit on it’s own, the naming convention of Scoped is such a great, sharp name. Playlists are “scoped” to a channel so it makes total sense that the corresponding controller would be “channel scoped”.

module ChannelScoped
  extend ActiveSupport::Concern

  included do
    before_action :set_channel, :authorize_channel
  end

  private

  def set_channel
    @channel = Channel.find(params[:channel_id])
  end

  def authorize_channel
    authorize @channel # check that user has access, etc
  end
end

class Channels::SubscriptionsController < ApplicationController
  include ChannelScoped
end

class Channels::VideosController < ApplicationController
  include ChannelScoped
end

class Channels::PlaylistsController < ApplicationController
  include ChannelScoped
end
Enter fullscreen mode Exit fullscreen mode

Additional Resources

DHH Gist: Models for Nested Resources


Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post →

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →