Class: Seven::Manager
- Inherits:
-
Object
- Object
- Seven::Manager
- Defined in:
- lib/seven/manager.rb
Instance Attribute Summary collapse
-
#rules ⇒ Object
readonly
Returns the value of attribute rules.
-
#store ⇒ Object
readonly
Returns the value of attribute store.
Instance Method Summary collapse
- #can?(current_user, ability, target = nil) ⇒ Boolean
- #define_rules(matcher, rule_class = nil, &rule_proc) ⇒ Object
-
#initialize(store: {}) ⇒ Manager
constructor
Params: store: hash or your store, the store requires get(user_id) and set(user_id, ability, status) methods get(user_id) should return a hash of abilities ${ability: $|| false}.
Constructor Details
#initialize(store: {}) ⇒ Manager
Params:
store: hash or your store, the store requires get(user_id) and set(user_id, ability, status) methods
get(user_id) should return a hash of abilities {${ability}: ${true || false}}
8 9 10 11 |
# File 'lib/seven/manager.rb', line 8 def initialize(store: {}) @rules = [] @store = fetch_store(store) end |
Instance Attribute Details
#rules ⇒ Object (readonly)
Returns the value of attribute rules.
3 4 5 |
# File 'lib/seven/manager.rb', line 3 def rules @rules end |
#store ⇒ Object (readonly)
Returns the value of attribute store.
3 4 5 |
# File 'lib/seven/manager.rb', line 3 def store @store end |
Instance Method Details
#can?(current_user, ability, target = nil) ⇒ Boolean
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/seven/manager.rb', line 23 def can?(current_user, ability, target = nil) matched_rules = rules.select {|m, rc| m === target || m == target } return false if matched_rules.empty? # class A; end # class B < A; end # [A, B, Object].min # => B # find last class rule_class = matched_rules.min_by(&:first).last abilities = rule_class.new(current_user, target).abilities # dynamic abilities store.list(current_user).each do |new_ability, is_allowed| is_allowed ? (abilities << new_ability) : abilities.delete(new_ability) end abilities.include?(ability.to_sym) end |
#define_rules(matcher, rule_class = nil, &rule_proc) ⇒ Object
13 14 15 16 17 18 19 20 21 |
# File 'lib/seven/manager.rb', line 13 def define_rules(matcher, rule_class = nil, &rule_proc) rule_class ||= Seven::Abilities.wrap_proc(rule_proc) if valid_rule_class?(rule_class) @rules << [matcher, rule_class] else raise ArgsError, 'No valid rule_class or rule_proc' end end |