Hi Everyone,
I have a question about meta programming, which I will get to in a bit.
Below I have a little code snippet of a user roles plugin to Rails that I am
trying to build.
Essentially, I want to be able to define roles in "app/models/roles" that
get loaded on Rails bootup,
and define the permissions each role has. Por ejemplo:
app/models/roles/guest.rb:
=================
class Guest < Role
permissions_for :users, {:view => true, :edit => false}
end
=================
Which will be able to be used like so:
=================
role = User.first.role #=> Guest
role.get_permission(:users, :view) #=> true
=================
Now, I'd like to be able to define base role classes, and inherit/override
their permissions for subclasses:
================
class Admin < Guest
permissions_for :users, {:edit => true}
end
================
So that I can ask the Admin role if it can view or edit users:
================
Guest.get_permission(:users, :view) #=> true
Guest.get_permission(:users, :edit) #=> false
Admin.get_permission(:users, :view) #=> true
Admin.get_permission(:users, :edit) #=> true
================
The code below ALMOST accomplishes this basic functionality...
*QUESTION*
How can I get this to work? Can I utilize :attr_accessor somehow to replace
the "def permissions" and "def permissions=" calls?
I'm pretty sure class instance variables are what I need (so that each class
has it's own set of permissions), but how/where to define
the accessor methods are tripping me up.
(NOTE that @permissions is a "class instance variable", not an "instance
variable")
==============================
class Role
# Open that sweet, sweet eigenclass for some tender permissioning.
class << self
def permissions
@permissions ||= {}
end
def permissions=(new_perms)
permissions = new_perms
end
# Copies the parent's permissions into child as the
# baseline permissions (inheriting the permissions, essentially).
def inherited(child_class)
child_class.permissions = permissions.dup
end
# Look through permissions hash for the resource and permission
asked for.
def get_permission(resource, permission)
perm = permissions[resource][permission.to_sym] if
permissions[resource]
perm.present? ? perm : false
end
private
# Define permissions for this subclass
def permissions_for(resource, new_permissions = {})
permissions[resource] ||= {}
permissions[resource].merge!(new_permissions)
end
end
end
====================================
Thanks!
- Adam
--
Adam Grant
Lead Web Engineer
Telaeris, Inc.
[email protected]
(858) 627-9710
--
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby