ruby-on-railsmerit-gem

Rails Merit Gem, How to display timeline of reputation changes


I'm using the merit gem for rails, and would like to have a timeline of reputation changes, badges earned etc. For example

Based on the readme, I created the following:

config/initializers/merit.rb

config.add_observer 'ReputationChangeObserver'

reputation_change_observer.rb

class ReputationChangeObserver
  def update(changed_data)
    # `changed_data[:description]` holds information on what changed
    # badges granted or removed, points changed.

    # `changed_data[:merit_object]` reputation related object created by merit.
    # It responds to `sash_id` and `sash`. From there you can get to your
    # application object that had it's reputation changed, for example:
    # sash_id = changed_data[:merit_object].sash_id
    # User.where(sash_id: sash_id).first

    # You may use this to fill a timeline with notifications for users, send
    # emails, etc.

  end
end

Question is, what next? How do I use the observer to display a timeline of the current_user.changed_data?


Solution

  • API seems a little uncomfortable for now, anyway here's sample code that works in current merit master (1515c6463f92aaace6298015c0f8e70064885779):

    class ReputationChangeObserver
      def update(changed_data)
        # description will be something like:
        #   granted 5 points
        #   granted just-registered badge
        #   removed autobiographer badge
        description = changed_data[:description]
    
        # If user is your meritable model, you can grab it like:
        if changed_data[:merit_object]
          sash_id = changed_data[:merit_object].sash_id
          user = User.where(sash_id: sash_id).first
        end
    
        # To know where and when it happened:
        merit_action = Merit::Action.find changed_data[:merit_action_id]
        controller = merit_action.target_model
        action = merit_action.action_method
        when = merit_action.created_at
    
        # From here on, you can create a new Notification assuming that's an
        # ActiveRecord Model in your app, send an email, etc. For example:
        Notification.create(
          user: user,
          what: description,
          where: "#{controller}##{action}",
          when: when)
      end
    end
    

    EDIT: Please note that API has changed since this answer, see https://github.com/tute/merit#getting-notifications.