Roles for Mongo Mapper
Install
gem install roles_for_mm
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_mm'
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
= 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')
= User.new(:name => 'Author')
guest_user.roles << Role.new(:name => 'guest')
guest_user.save
admin_user.roles << Role.new(:name => 'admin')
admin_user.save
.roles << Role.new(:name => 'author')
.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
Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.