Roles for Active Record

This is an Active Record implementation of the Roles generic API Please also see the Roles generic README

Roles lets you add a role strategy of choice to your user model. Roles supports strategies with either an inline attribute on user or a separate Role model (see below).

Install

gem install roles_active_record

Install in Rails app

Insert in Gemfile:

gem 'roles_active_record'

Run $ bundle install from terminal

Alternatively install using Cream

Role strategies

The following Role strategies are available for Active Record:

Inline attribute on User

  • admin_flag
  • roles_mask
  • role_string

These strategies all use an inline attribute on the User model.

Reference to Role

  • many_roles
  • one_role

These strategies use a separate Role model (class and table).

Role strategy configuration

The following demonstrates some examples of role strategy configuration.

Strategy: admin_flag

class User < ActiveRecord::Base    
  include Roles::ActiveRecord 
    
  strategy :admin_flag, :default
  valid_roles_are :admin, :guest
  
  def initialize attributes = {}
    super
    add_role default_role
  end  
end

Here the initializer initially sets the role of the user tothe default_role, which is the available role matching the class name (or nil in case no match)

Strategy: one_role

For strategies that use a separate Role model you must call the class method #role_class with the name of the role class

class Bruger < ActiveRecord::Base
  include Roles::ActiveRecord 

  strategy :one_role, :role_class => :rolle
  valid_roles_are :admin, :guest
end

Strategy: many_roles

Both the Role class and join class between User and Role can be customized using options

class Bruger < ActiveRecord::Base
  include Roles::ActiveRecord 

  strategy :one_role, :role_class => :rolle, :user_role_class => :bruger_rolle
  valid_roles_are :admin, :guest
end

Default Role classes

The default role classes can currently be included by:

One role:

require 'roles_active_record/one_role'

Many roles:

require 'roles_active_record/many_roles'

Note: These files will automatically be included when needed under normal conditions.

Roles generators

The gem includes these Rails 3 generators:

  • active_record:roles
  • active_record:roles_migration

Roles generator

Let you populate a User model with a given role strategy

Example: Apply Role strategy admin_flag to the User and make the default roles :admin and :guest available

$ rails g active_record:roles User --strategy admin_flag

Example: Apply Role strategy role_string to the User and make the roles :admin, :guest and :author available

$ rails g active_record:roles_migration User --strategy role_string --roles author

Example: Apply Role strategy one_role to the User model with roles :user, :special and :editor

$ rails g active_record:roles_migration User --strategy one_role --roles user special editor --no-default-roles

Example: Apply Role strategy many_role to the User model with default roles and customizing role class names to BrugerRolle and Rolle

$ rails g active_record:roles_migration User -s one_role -r user editor -rc Rolle -urc BrugerRolle

For the strategies one_role and many_roles the generator also generates the Role and UserRole classes in the app/models dir. If you customize the names of these classes (using generator arguments), the customized classes will be generated and “linked up” correctly (with has and belongs_to statements).

Roles migration generator

In case you only want to generate Role migrations.

Example: admin_flag Role strategy

$ rails g active_record:roles_migration User --strategy admin_flag

Create reverse migration

$ rails g active_record:roles_migration User --strategy admin_flag --reverse

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