lib/authority/abilities.rb in authority-0.9.0 vs lib/authority/abilities.rb in authority-1.0.0.pre2
- old
+ new
@@ -1,43 +1,49 @@
module Authority
+
+ # Should be included into all models in a Rails app. Provides the model
+ # with both class and instance methods like `updatable_by?(user)`
+ # Exactly which methods get defined is determined from `config.abilities`;
+ # the module is evaluated after any user-supplied config block is run
+ # in order to make that possible.
+ # All delegate to the methods of the same name on the model's authorizer.
+
module Abilities
extend ActiveSupport::Concern
+ # Let the Foo model know that its authorizer is called 'FooAuthorizer'
included do
class_attribute :authorizer_name
-
self.authorizer_name = "#{name}Authorizer"
end
module ClassMethods
Authority.adjectives.each do |adjective|
- # Metaprogram needed methods, allowing for nice backtraces
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{adjective}_by?(user)
authorizer.#{adjective}_by?(user)
end
RUBY
end
def authorizer
- @authorizer ||= authorizer_name.constantize
+ @authorizer ||= authorizer_name.constantize # Get an actual reference to the authorizer class
rescue NameError => e
raise Authority::NoAuthorizerError.new("#{authorizer_name} does not exist in your application")
end
end
Authority.adjectives.each do |adjective|
- # Metaprogram needed methods, allowing for nice backtraces
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{adjective}_by?(user)
authorizer.#{adjective}_by?(user)
end
def authorizer
- self.class.authorizer.new(self)
+ self.class.authorizer.new(self) # instantiate on every check, in case model has changed
end
RUBY
end
end