Class: Spree::Ability

Inherits:
Object
  • Object
show all
Includes:
CanCan::Ability
Defined in:
app/models/spree/ability.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user) ⇒ Ability

Returns a new instance of Ability.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'app/models/spree/ability.rb', line 25

def initialize(user)
  # add cancancan aliasing
  alias_action :delete, to: :destroy
  alias_action :create, :update, :destroy, to: :modify

  user ||= Spree.user_class.new

  if user.respond_to?(:has_spree_role?) && user.has_spree_role?('admin')
    can :manage, :all
  else
    can :read, Country
    can :read, OptionType
    can :read, OptionValue
    can :create, Order
    can :show, Order do |order, token|
      order.user == user || order.token && token == order.token
    end
    can :update, Order do |order, token|
      !order.completed? && (order.user == user || order.token && token == order.token)
    end
    can :manage, Spree::Address do |address|
      address.user == user
    end
    can :create, Spree::Address do |_address|
      user.id.present?
    end
    can :read, CreditCard, user_id: user.id
    can :read, Product
    can :read, ProductProperty
    can :read, Property
    can :create, Spree.user_class
    can [:show, :update, :destroy], Spree.user_class, id: user.id
    can :read, State
    can :read, Taxon
    can :read, Taxonomy
    can :read, Variant
    can :read, Zone
  end

  # Include any abilities registered by extensions, etc.
  Ability.abilities.merge(abilities_to_register).each do |clazz|
    merge clazz.new(user)
  end

  # Protect admin role
  cannot [:update, :destroy], Role, name: ['admin']
end

Class Method Details

.register_ability(ability) ⇒ Object

Allows us to go beyond the standard cancan initialize method which makes it difficult for engines to modify the default Ability of an application. The ability argument must be a class that includes the CanCan::Ability module. The registered ability should behave properly as a stand-alone class and therefore should be easy to test in isolation.



17
18
19
# File 'app/models/spree/ability.rb', line 17

def self.register_ability(ability)
  abilities.add(ability)
end

.remove_ability(ability) ⇒ Object



21
22
23
# File 'app/models/spree/ability.rb', line 21

def self.remove_ability(ability)
  abilities.delete(ability)
end