Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Reputation system Rails engine.
Ruby JavaScript

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
app/models
lib
test
.gitignore
Gemfile
Gemfile.lock
README.rdoc
Rakefile
merit.gemspec

README.rdoc

Merit Rails Gem

Define reputation for users and data on your application.

Installation

  1. Add 'merit' to your Gemfile

  2. Run rails g merit:install

  3. Run rails g merit MODEL_NAME

  4. Run rake db:migrate

  5. Configure reputation rules for your application

Defining badge rules

You may give badges to any resource on your application if some condition holds. Badges may have levels, and may be temporary.

Define rules on app/models/merit_badge_rules.rb:

grant_on accepts:

  • controller#action string (similar to Rails routes)

  • :badge for badge name

  • :level for badge level

  • :to: method name over target_object which obtains user to badge.

  • :temporary (boolean): if the condition doesn't hold and the receiver had the badge, it gets removed. false by default (badges are kept forever).

  • &block

    • empty (always grants)

    • a block which evaluates to boolean (recieves target object as parameter)

    • a block with a hash composed of methods to run on the target object with expected values

Examples

grant_on 'comments#vote', :badge => 'relevant-commenter', :to => :user do
  { :votes => 5 }
end

grant_on ['users#create', 'users#update'], :badge => 'autobiographer', :temporary => true do |user|
  user.name.present? && user.address.present?
end

Defining point rules

Points are a simple integer value which are given to “meritable” resources. They are given on actions-triggered, either to the action user or to the method (or array of methods) defined in the :to option.

Define rules on app/models/merit_point_rules.rb:

Examples

score 10, :on => [
  'users#update'
]

score 15, :on => 'reviews#create', :to => [:reviewer, :reviewed]

score 20, :on => [
  'comments#create',
  'photos#create'
]

Defining rank rules

Rankings are very similar to badges. They give “badges” which have a hierarchy defined by level's lexicografical order (greater is better). If a rank is granted, lower level ranks are taken off. 5 stars is a common ranking use case.

They are not given at specified actions like badges, you should define a cron job to test if ranks are to be granted.

Define rules on app/models/merit_rank_rules.rb:

set_rank accepts:

  • badge_name name of this ranking

  • :level ranking level (greater is better)

  • :to model or scope to check if new rankings apply

Check for rules on a rake task executed in background like:

task :cron => :environment do
  MeritRankRules.new.check_rank_rules
end

Examples

set_rank :stars, :level => 2, :to => Commiter.active do |commiter|
  commiter.branches > 1 && commiter.followers >= 10
end

set_rank :stars, :level => 3, :to => Commiter.active do |commiter|
  commiter.branches > 2 && commiter.followers >= 20
end

Grant manually

You may also add badges/rank “by hand” from controller actions:

Badge.find(3).grant_to(current_user)

Test application

To run the test application inside this gem follow:

  1. cd test/dummy

  2. rails g merit:install

  3. rails g merit user

  4. rake db:migrate ; rake db:seed

  5. rails s

To-do list

  • Test points granting with different options.

  • Ranking should not be badges, so .badges doesn't return them (2-stars shouldn't be badge).

  • grep -r 'FIXME|TODO' .

  • :value parameter (for star voting for example) should be configurable (depends on params[:value] on the controller).

  • Make fixtures for integration testing (now creating objects on test file!).

Something went wrong with that request. Please try again.