Tip: 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.
Scoped concern pattern: a place to put shared code (setting variables, authorization) and slim down your controllers.
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
DHH Gist: Models for Nested Resources