# Generic Role strategies
Generic role strategies that share the same API and are easy to insert in any existing User model.
Comes with a Rails 3 generator to instantly configure your Rails 3 app with a Role strategy of choice.
I have developed the following *roles* gems for popular ORMs that all support the same roles generic API.
* Active Record - [roles_active_record](http://github.com/kristianmandrup/roles_active_record)
* DataMapper - [roles_data_mapper](http://github.com/kristianmandrup/roles_data_mapper)
* Mongoid - [roles_mongoid](http://github.com/kristianmandrup/roles_mongoid)
* MongoMapper - [roles_mongo_mapper](http://github.com/kristianmandrup/roles_mongo_mapper))
Feel free to roll your own ORM extension for your favorite ORM!
## Status update (4 sept, 2010)
Roles generic has now been refactored in order to tidy up the code base and make it even more generic, flexible and easy to extend.
Currently I'm not sure if the generator fully works. It has a dependency on [rails3_artifator](http://github.com/kristianmandrup/rails3_artifator), which should work.
However my gem to test generators (called [generator-spec](http://github.com/kristianmandrup/generator-spec), is currently not functioning as it has dependencies to other gems that have undergone major
refactorings lately. Let me know if the generator works or if not, see if you can make it work using *rails3_artifactor* and let me know the fix ;)
## Install
gem install roles_generic
## Usage
The library comes with the following role models built-in:
* admin_flag (Boolean flag - 'admin' or not)
* role_string (String)
* roles_string (Comma separated String - note: no role name must have a comma in its name!)
* role_strings (Set of Strings)
* roles_mask (Integer mask)
* one_role (relation to a Role model instance)
* many_roles(Set of Role relationships)
Note: The following examples use RSpec to demonstrate usage scenarios.
Examples of configuring for the other strategies can be found in the wiki pages.
## Example : admin_flag
Creates and uses a binary field 'admin_flag', which when true signals that this user is an administrator and otherwise a normal user.
class User include Roles::Generic attr_accessor :name, :admin_flag role_strategy :admin_flag, :default roles :admin, :user def initialize name, *new_roles self.name = name self.roles = new_roles end end## Example: Using an ORM Data Mapper with persistent attributes :name and :admin_flag
class User include Roles::Generic include DataMapper::Resource property :name, Boolean property :admin_flag, Boolean role_strategy :admin_flag, :default roles :admin, :user def initialize name, *new_roles self.name = name self.roles = new_roles end end## Role API ### Instance methods Has ALL of the given roles been assigned? * has_roles?(*roles) - alias: is? Has ANY (at least ONE) of the given roles been assigned? * has_role? *roles - alias: has? Is this a valid role? (can the role be found in list of valid roles?) * valid_role? role Is this user the admin user (and user has no other roles) * admin? - short for - is?(:admin) ### Class methods * roles - list of valid roles * roles_attribute - get the attribute where the role is stored on the user * roles_attribute= - set the role(s) attribute ## Usage of API
before :each do @admin_user = User.new 'Admin user', :admin @guest = User.new 'Guest', :guest end it "user 'Admin user' should have role :admin" do @admin_user.role.should == :admin @admin_user.roles.should == [:admin] @admin_user.admin?.should be_true @admin_user.has_role? (:user).should be_false @admin_user.has_role? (:admin).should be_true @admin_user.is? (:admin).should be_true @admin_user.has_roles? (:admin).should be_true @admin_user.has? (:admin).should be_true end it "user Guest should have role :guest" do @guest.roles.should == [:guest] @guest.admin?.should be_false @guest.has_role? (:guest).should be_true @guest.has_role? (:admin).should be_false @guest.is? (:admin).should be_false @guest.has_roles? (:guest).should be_true @guest.has? (:admin).should be_false end it "should set role of Guest user from :guest to :admin using roles=" do @guest.roles = :admin @guest.role.should == :admin @guest.has_role?(:admin).should be_true end## Note on Patches/Pull Requests * Fork the project. * Make your feature addition or bug fix. * Add tests for it. This is important so I don't break it in a future version unintentionally. * Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull) * Send me a pull request. Bonus points for topic branches. ## Copyright Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.