module Seven::Rails::ControllerHelpers::ClassMethods

Attributes

seven_ability_checker[R]

Public Instance Methods

seven_ability_check(default_target, custom_checker = nil, opts = {}) click to toggle source

Examples:

ability_check :@topic
ability_check [:@topic, Topic]
ability_check [:@topic, Topic], show: {ability: :read_t, target: [:user]}
ability_check show: {ability: :read_t, target: [:user]}
ability_check action1: {something_opts}, action2: {someting_opts}
ability_check [:@topic, Topic], nil, resource_name: :comments
# File lib/seven/rails/controller_helpers.rb, line 61
def seven_ability_check(default_target, custom_checker = nil, opts = {})
  @seven_ability_checker = seven_generate_controller_checker(
    default_target, custom_checker, opts
  )

  before_action :seven_ability_check_filter
end

Private Instance Methods

seven_format_ability_checker(checker) click to toggle source
# File lib/seven/rails/controller_helpers.rb, line 110
def seven_format_ability_checker(checker)
  checker.each_with_object({}) do |data, result|
    action_name, action_checker = data
    tmp = result[action_name.to_sym] = action_checker.symbolize_keys

    unless tmp[:ability] && tmp[:target]
      raise Seven::ArgsError, "Invalid checker #{action_name}: #{action_checker}"
    end
  end
end
seven_generate_controller_checker(default_target, custom_checker, opts) click to toggle source
# File lib/seven/rails/controller_helpers.rb, line 72
def seven_generate_controller_checker(default_target, custom_checker, opts)
  if default_target.is_a?(Hash)
    raise Seven::ArgsError, 'Invalid arguments' if custom_checker
    seven_format_ability_checker(default_target)
  else
    controller_checker = seven_generate_default_ability_checker(
      default_target, opts[:resource_name] || opts['resource_name']
    )

    if custom_checker.is_a?(Hash)
      controller_checker.merge(seven_format_ability_checker(custom_checker))
    elsif custom_checker.nil?
      controller_checker
    else
      raise Seven::ArgsError, 'Invalid arguments'
    end
  end
end
seven_generate_default_ability_checker(target, resource_name) click to toggle source
# File lib/seven/rails/controller_helpers.rb, line 91
def seven_generate_default_ability_checker(target, resource_name)
  resource_name ||= name.demodulize.sub(/Controller$/, '').underscore
  pluralize_name = resource_name.to_s.pluralize
  singularize_name = resource_name.to_s.singularize

  [
    [:index, :read, pluralize_name],
    [:show, :read, singularize_name],
    [:new, :create, singularize_name],
    [:edit, :edit, singularize_name],
    [:create, :create, singularize_name],
    [:update, :edit, singularize_name],
    [:destroy, :delete, singularize_name]
  ].each_with_object({}) do |data, result|
    action_name, opt, resource_name = data
    result[action_name] = {ability: "#{opt}_#{resource_name}".to_sym, target: target}
  end
end