= Merit Rails Gem

Define reputation for users and data on your application.

http://i567.photobucket.com/albums/ss118/DeuceBigglebags/th_nspot26_300.jpg


= 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)


= Upgrade to 0.2.0

Added +had_errors+ boolean attribute to +merit_actions+ table.


= 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!).