用 "范围 "模式在Rails控制器之间共享公共代码

61 阅读1分钟

如果你遵循严格的REST/嵌套资源方法来构建你的Rails应用,你可能会厌倦重复常见的控制器操作。

试试Scoped concern模式:这是一个放置共享代码(设置变量、授权)和精简控制器的地方。

使用方法

这种特殊的模式来自DHH和Basecamp--一个以使用大量微小的关注点来共享行为而自豪的代码库。

虽然重复使用相同的before_actions来查找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