Find file
Fetching contributors…
Cannot retrieve contributors at this time
executable file 174 lines (110 sloc) 4.81 KB
= acts_as_taggable_on_steroids
NOT THE OFFICIAL REPO, I just imported this project to get few bug fixed when I was using it for a project in early 2008.
If you find this plugin useful, please consider a donation to show your support!
Email address:
== Instructions
This plugin is based on acts_as_taggable by DHH but includes extras
such as tests, smarter tag assignment, and tag cloud calculations.
== Installation
ruby script/plugin install
== Usage
=== Prepare database
Generate and apply the migration:
ruby script/generate acts_as_taggable_migration
rake db:migrate
=== Basic tagging
Let's suppose users have many posts and we want those posts to have tags.
The first step is to add +acts_as_taggable+ to the Post class:
class Post < ActiveRecord::Base
belongs_to :user
We can now use the tagging methods provided by acts_as_taggable, <tt>#tag_list</tt> and <tt>#tag_list=</tt>. Both these
methods work like regular attribute accessors.
p = Post.find(:first)
p.tag_list # []
p.tag_list = "Funny, Silly"
p.tag_list # ["Funny", "Silly"]
You can also add or remove arrays of tags.
p.tag_list.add("Great", "Awful")
=== Finding tagged objects
To retrieve objects tagged with a certain tag, use find_tagged_with.
Post.find_tagged_with('Funny, Silly')
By default, find_tagged_with will find objects that have any of the given tags. To
find only objects that are tagged with all the given tags, use match_all.
Post.find_tagged_with('Funny, Silly', :match_all => true)
See <tt>ActiveRecord::Acts::Taggable::InstanceMethods</tt> for more methods and options.
=== Tag cloud calculations
To construct tag clouds, the frequency of each tag needs to be calculated.
Because we specified +acts_as_taggable+ on the <tt>Post</tt> class, we can
get a calculation of all the tag counts by using <tt>Post.tag_counts</tt>. But what if we wanted a tag count for
an single user's posts? To achieve this we call tag_counts on the association:
A helper is included to assist with generating tag clouds. Include it in your helper file:
module ApplicationHelper
include TagsHelper
Here is an example that generates a tag cloud.
class PostController < ApplicationController
def tag_cloud
@tags = Post.tag_counts
<% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %>
<%= link_to, { :action => :tag, :id => }, :class => css_class %>
<% end %>
.css1 { font-size: 1.0em; }
.css2 { font-size: 1.2em; }
.css3 { font-size: 1.4em; }
.css4 { font-size: 1.6em; }
==== Simple View with Link
<a href="TAG_PATH#1">TAG_NAME#1</a>, <a href="TAG_PATH#2">TAG_NAME#2</a>
if you want change tag_path then modify TagHelper::link_to_tag
default path is
{ :action => :tag, :id => tag_name }
class PostController < ApplicationController
def show
@post = Post.find(params[:id])
<%= link_to_tags(@post.tags) %>
=== Caching
It is useful to cache the list of tags to reduce the number of queries executed. To do this,
add a column named <tt>cached_tag_list</tt> to the model which is being tagged. The column should be long enough to hold
the full tag list and must have a default value of null, not an empty string.
class CachePostTagList < ActiveRecord::Migration
def self.up
add_column :posts, :cached_tag_list, :string
class Post < ActiveRecord::Base
# The caching column defaults to cached_tag_list, but can be changed:
# set_cached_tag_list_column_name "my_caching_column_name"
The details of the caching are handled for you. Just continue to use the tag_list accessor as you normally would.
Note that the cached tag list will not be updated if you directly create Tagging objects or manually append to the
<tt>tags</tt> or <tt>taggings</tt> associations. To update the cached tag list you should call <tt>save_cached_tag_list</tt> manually.
=== Delimiter
If you want to change the delimiter used to parse and present tags, set TagList.delimiter.
For example, to use spaces instead of commas, add the following to config/environment.rb:
TagList.delimiter = " "
You can also use a regexp as delimiter:
TagList.delimiter = /,|;/
The above code would parse the string and use ',' and ';' as delimiters.
=== Unused tags
Set Tag.destroy_unused to remove tags when they are no longer being
used to tag any objects. Defaults to false.
Tag.destroy_unused = true
=== Other
Problems, comments, and suggestions all welcome.