Roles for Data Mapper

Install

gem install roles_for_dm

Usage

The library comes with the following role models built-in:

  • Single inline role (string)
  • Multiple inline role (strings)
  • Multiple role relations (many relationship using array of object ids)

Note: The following examples use RSpec to demonstrate usage scenarios.

Example : Admin flag

Creates and uses a binary field 'admin', which when true signals that this user is an administrator and otherwise a normal user.


require 'roles_for_dm'

User.role_strategy :admin_flag

before :each do
  User.new(:name => 'Guest user', :role => 'guest').save
  User.new(:name => 'Admin user', :role => 'admin').save
end

it "should return first user maching role" do
  User.in_role('guest').first.name.should == 'Kristian'
  User.in_role('admin').first.name.should == 'Admin user'
end

before :each do User.new(:name => 'Guest user', :role => 'guest').save User.new(:name => 'Admin user', :role => 'admin').save end

it "should return first user maching role" do User.in_role('guest').first.name.should == 'Guest user' User.in_role('admin').first.name.should == 'Admin user' end

Example : Single inline role

Creates and uses a single role name, a string


User.role_strategy :inline_role

# same as the previous admin_flag example
... 

Example : Multiple inline roles

Creates and uses an array of role names as strings


User.role_strategy :inline_roles

before :each do
  guest_user = User.new(:name => 'Guest user', :roles => ['guest']).save
  admin_user = User.new(:name => 'Admin user', :roles => ['admin']).save
  author_user = User.new(:name => 'Author', :roles => ['author']).save
end

it "should return first user matching role" do
  User.in_role('admin').first.name.should == 'Admin user'
end

it "should return all users matching any of the roles" do
  User.in_roles(['guest', 'admin']).all.size.should == 2
  User.in_roles('guest', 'admin').all.size.should == 2
end

Example : Multiple role relations

Creates and uses a 1-M relation to a Role model, which the User model stores as an array of BSON ObjectIDs


require 'roles_for_mm'

User.role_strategy :roles_relations

before :each do
  guest_user = User.new(:name => 'Guest user')
  admin_user = User.new(:name => 'Admin user')
  author_user = User.new(:name => 'Author')

  guest_user.roles << Role.new(:name => 'guest')
  guest_user.save      

  admin_user.roles << Role.new(:name => 'admin')
  admin_user.save      
  
  author_user.roles << Role.new(:name => 'author')
  author_user.save      
end    

it "should return first user matching role" do
  User.in_role('guest').first.name.should == 'Guest user'
  User.in_role('admin').first.name.should == 'Admin user'
end

it "should return all users matching any of the roles" do
  User.in_roles(['guest', 'admin']).all.size.should == 2
  User.in_roles('guest', 'admin').all.size.should == 2 
end

Example : Roles mask

Creates and uses an inline Integer field in the User model called 'role_mask'


before :each do
  User.available_roles = ['guest', 'admin', 'author']
  
  User.new(:name => 'Kristian', :roles => ['guest']).save
  User.new(:name => 'Admin user', :roles => ['admin']).save
  User.new(:name => 'Author', :roles => ['author']).save               
end

it "should return first user matching role" do
  User.in_role('admin').first.name.should == 'Admin user'
end

it "should return all users matching any of the roles" do
  User.in_roles(['guest', 'admin']).size.should == 2
  User.in_roles('guest', 'admin').size.should == 2
end

Rails generator

The library comes with a Rails 3 generator that lets you populate a user model with a given role strategy The following role strategies are included by default. Add your own by adding extra files inside the strategy folder, one file for each role strategy is recommended.

  • admin_flag
  • inline_role
  • inline_roles
  • role_relations
  • role_mask

Example:

$ rails g mongo_mapper:roles user admin_flag

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 (c) 2010 Kristian Mandrup. See LICENSE for details.