MakeFlaggable is an extension for building a user-centric flagging system for Rails 3 and 4 applications. It currently supports ActiveRecord models.
This repository is unfortunately no longer maintained. If this library is still relevant and you want to maintain it, I am happy to hand this repository over.
add MakeFlaggable to your Gemfile
generate the required migration file
rails generate make_flaggable
migrate the database
# Specify a model that can be flagged. class Article < ActiveRecord::Base make_flaggable end # Specify a model that can flag another model. class User < ActiveRecord::Base make_flagger end # You can specify that a flagger can only flag a flaggable once. class User < ActiveRecord::Base make_flagger :flag_once => true end # The user can now flag the flaggable. # If the user already flagged the flaggable and :flag_once was set then an AlreadyFlaggedError is raised. user.flag!(article, reason) # The method without bang(!) does not raise the AlreadyFlaggedError when the user flags the flaggable more than once. # Instead it just returns false and ignores the flagging. # If :flag_once was not set then this method behaves like flag! method. user.flag(article, reason) # The user may unflag an already done flagging. # If the user never flagged the flaggable then an NotFlaggedError is raised. user.unflag!(article) # The method without bang(!) does not raise the NotFlaggedError, but just returns false if the user never flagged # the flaggable. user.unflag(article) # Get all flaggings of a flaggable. article.flaggings # Get the flagging with a specified flag. article.flaggings.with_flag(:flag_name) # Get the flagger of the flagging. flagging = article.flaggings.with_flag(:flag_name).first user = flagging.flagger # Returns true if the flagger flagged the flaggable, false otherwise. user.flagged?(article, :flag_name) # Get the reason of a flagging. flagging = article.flaggings.first flagging.reason # Get the flagger of the flagging. flagging = article.flaggings.first user = flagging.flagger # Returns true if the flagger flagged the flaggable, false otherwise. user.flagged?(article) # Return true if the flaggable was flagged by the flagger, false otherwise. article.flagged_by?(user) # Returns true if the article was flagged by any flagger at all, false otherwise. article.flagged? # Flaggings can also be accessed by its flagger. flagger.flaggings # In order to obtain all flaggers of a resource, the flaggers method can be invoked on the class # Passing no argument would return flaggers that have flagged across any flaggable resource User.flaggers # An optional argument can be passed, restricting the detection to a particular resource User.flaggers(Article)
MakeFlaggable uses RSpec for testing and has a rake task for executing the provided specs
Copyright © 2010-2011 Kai Schlamp (www.medihack.org), released under the MIT license