lib/aegis/has_role.rb in aegis-1.1.8 vs lib/aegis/has_role.rb in aegis-2.0.0
- old
+ new
@@ -1,110 +1,89 @@
-module Aegis
- module HasRole
-
- def validates_role_name(options = {})
- validates_each :role_name do |record, attr, value|
- options[:message] ||= I18n.translate('activerecord.errors.messages.inclusion')
- role = ::Permissions.find_role_by_name(value)
- record.errors.add attr, options[:message] if role.nil?
- end
- end
-
- alias_method :validates_role, :validates_role_name
-
- def has_role(options = {})
-
- # Legacy parameter names
- options[:accessor] ||= options.delete(:name_accessor)
- options[:reader] ||= options.delete(:name_reader)
- options[:writer] ||= options.delete(:name_writer)
-
- if options[:accessor]
- options[:reader] = "#{options[:accessor]}"
- options[:writer] = "#{options[:accessor]}="
- options.delete(:accessor)
- end
-
- self.class_eval do
-
- class_attribute :aegis_role_name_reader, :aegis_role_name_writer, :aegis_default_role_name
-
- unless method_defined?(:after_initialize)
- def after_initialize
- end
- end
-
- if options[:default]
- self.aegis_default_role_name = options[:default].to_s
- after_initialize :set_default_aegis_role_name
- end
-
- self.aegis_role_name_reader = (options[:reader] || "role_name").to_sym
- self.aegis_role_name_writer = (options[:writer] || "role_name=").to_sym
-
- def aegis_role_name_reader
- self.class.class_eval{ aegis_role_name_reader }
- end
-
- def aegis_role_name_writer
- self.class.class_eval{ aegis_role_name_writer }
- end
-
- def aegis_role_name
- send(aegis_role_name_reader)
- end
-
- def aegis_role_name=(value)
- send(aegis_role_name_writer, value)
- end
-
- def role
- ::Permissions.find_role_by_name!(aegis_role_name)
- end
-
- def role=(role_or_name)
- self.aegis_role_name = if role_or_name.is_a?(Aegis::Role)
- role_or_name.name
- else
- role_or_name.to_s
- end
- end
-
- private
-
- # Delegate may_...? and may_...! methods to the user's role.
- def method_missing_with_aegis_permissions(symb, *args)
- method_name = symb.to_s
- if method_name =~ /^may_(.+?)[\!\?]$/
- role.send(symb, self, *args)
- elsif method_name =~ /^(.*?)\?$/ && queried_role = ::Permissions.find_role_by_name($1)
- role == queried_role
- else
- method_missing_without_aegis_permissions(symb, *args)
- end
- end
-
- alias_method_chain :method_missing, :aegis_permissions
-
- def respond_to_with_aegis_permissions?(symb, include_private = false)
- if symb.to_s =~ /^may_(.+?)[\!\?]$/
- true
- else
- respond_to_without_aegis_permissions?(symb, include_private)
- end
- end
-
- alias_method_chain :respond_to?, :aegis_permissions
-
- def set_default_aegis_role_name
- if new_record? && self.aegis_role_name.blank?
- self.aegis_role_name = self.class.aegis_default_role_name
- end
- end
-
- end
-
- end
-
- end
-
-end
+module Aegis
+ module HasRole
+
+ def has_role(options = {})
+
+ if options[:accessor]
+ options[:reader] = "#{options[:accessor]}"
+ options[:writer] = "#{options[:accessor]}="
+ options.delete(:accessor)
+ end
+
+ get_role_name = (options[:reader] || "role_name").to_sym
+ set_role_name = (options[:writer] || "role_name=").to_sym
+
+ permissions = lambda { Aegis::Permissions.app_permissions(options[:permissions]) }
+
+ may_pattern = /^may_(.+?)([\!\?])$/
+
+ send :define_method, :role do
+ permissions.call.find_role_by_name(send(get_role_name))
+ end
+
+ send :define_method, :role= do |role|
+ send(set_role_name, role.name)
+ end
+
+ metaclass.send :define_method, :validates_role do |*validate_options|
+ validate_options = validate_options[0] || {}
+
+ send :define_method, :validate_role do
+ role = permissions.call.find_role_by_name(send(get_role_name))
+ unless role
+ message = validate_options[:message] || I18n.translate('activerecord.errors.messages.inclusion')
+ errors.add get_role_name, message
+ end
+ end
+
+ validate :validate_role
+ end
+
+ if options[:default]
+
+ unless method_defined?(:after_initialize)
+ send :define_method, :after_initialize do
+ end
+ end
+
+ send :define_method, :set_default_role_name do
+ if new_record? && send(get_role_name).blank?
+ send(set_role_name, options[:default])
+ end
+ end
+
+ after_initialize :set_default_role_name
+
+ end
+
+ unless method_defined?(:method_missing_with_aegis_permissions)
+
+ # Delegate may_...? and may_...! methods to the permissions class.
+ send :define_method, :method_missing_with_aegis_permissions do |symb, *args|
+ method_name = symb.to_s
+ if method_name =~ may_pattern
+ action_path = $1
+ severity = $2
+ permissions.call.send("may#{severity}", self, action_path, *args)
+ else
+ method_missing_without_aegis_permissions(symb, *args)
+ end
+ end
+
+ alias_method_chain :method_missing, :aegis_permissions
+
+ send :define_method, :respond_to_with_aegis_permissions? do |symb, *args|
+ if symb.to_s =~ may_pattern
+ true
+ else
+ include_private = args.first.nil? ? false : args.first
+ respond_to_without_aegis_permissions?(symb, include_private)
+ end
+ end
+
+ alias_method_chain :respond_to?, :aegis_permissions
+
+ end
+ end
+
+ end
+end