Separating Abilities - ryanb/cancan GitHub Wiki

Below is a simple example how to separate abilities for each role.
Use a factory pattern and move responsibilities to appropriate ability files.

class ApplicationController
  # @override
  def current_ability
    @current_ability ||= Ability::Factory.build(user)
  end
end
class Ability::Factory
  def self.build(user)
    case user.role
      when :user then Ability::User.new(user)
      when :admin then Ability::Admin.new(user)
      when :editor then Ability::Editor.new(user)
    end
  end
end
class Ability::Editor < Ability
  def initialize(user)
    can :view, Report, last_modifier_id: user.id
  end
end
⚠️ **GitHub.com Fallback** ⚠️