title: Tagging & Tag Clouds Made Easy h1. Tagging & Tag Clouds Made Easy Agenda * Tags, Tag Clouds, Folksonomy - Glossary * Tag Clouds in the Wild * Why? Share. Tag. Discover. * Add Tags To Your Web App in 1-2-3 Steps * Add Tag Clouds To Your Web App in 1-2-3 Steps * Plugin Optimizations & Options * Rails Tagging Plugin Choices h1. Tags, Tag Clouds, Folksonomy - Glossary Tags - Quick & Easy Free-Style Keywords Tag Clouds - Listing of Most Popular Tags - More Popular Tags Usually Shown in Bigger Font Size or Deeper Color Folksonomy - Self-organizing non-hierarchical cataloging/classification system using free-style keywords (also known as tags) h3. Web 1.0/3.0 - Web 2.0 Category != Tag Taxonomy != Folksonomy Tag == Label, Keyword, Category (?) h1. Tag Clouds in the Wild * "Delicious Bookmark Tag Cloud":http://del.icio.us/tag * "Flickr Photo Tag Cloud":http://flickr.com/photos/tags * "LibraryThing Book Tag Cloud":http://www.librarything.com/tagcloud.php * "WordPress Blog Posting Tag Cloud":http://wordpress.com/tags h1. Why? Share. Tag. Discover. Tagging Examples * Location: burnaby gastown yaletown granville ubc stanleypark * Events: northernvoice groovyvan vanrb barcampvancouver vanajax * Ratings: * (1 Star) ** (2 Star) *** (3 Star) **** (4 Star) ***** (5 Star) Discover Examples * "Latest Bookmarks About Rails":http://del.icio.us/tag/rails * "Most Popular Bookmarks About Rails":http://del.icio.us/popular/rails * "Latest Blog Posts Tagged Vancouver":http://wordpress.com/tag/vancouver * "Latest Photos Tagged Vancouver":http://flickr.com/photos/tags/vancouver * Discover Related Tags and much more h1. Wikipedia Tagging Related Terms Tag Cloud Tag (metadata) "Tag Cloud":http://en.wikipedia.org/wiki/Tag_cloud "Social Bookmarking":http://en.wikipedia.org/wiki/Social_bookmarking "Folksonomy":http://en.wikipedia.org/wiki/Folksonomy "Taxonomy":http://en.wikipedia.org/wiki/Taxonomy "Web 2.0":http://en.wikipedia.org/wiki/Web_2.0 "Web 3.0":http://en.wikipedia.org/wiki/Web_3.0 "Semantic Web":http://en.wikipedia.org/wiki/Semantic_web h1. Add Tags To Your Web App Step 0: Install Taggable Plug-In Step 1: Add Database Tables (Tags, Taggings) Step 2: Mark Your ActiveRecord Classes (Bookmark, Photo, Book etcetera) As Taggable Step 3: That's it. h1. Step 1 - Add Database Tables (Tags, Taggings) The Tags Table {{{ create_table :tags do |t| t.column :name, :string # The tag name end }}} The Taggings (Polymorphic Join) Table {{{ create_table :taggings do |t| t.column :tag_id, :integer # foreign key; id of the tag t.column :taggable_id, :integer # foreign key; id of the taggable object t.column :taggable_type, :string # taggable object type (bookmark, photo, book, etcetera) t.column :created_at, :datetime # timestamp end }}} h1. Step 2 - Mark Your ActiveRecord Classes As Taggable {{{ class Photo < ActiveRecord::Base acts_as_taggable ... end }}} h3. Methods Added To Your ActiveRecord Model Classes * tag_list * find_tagged_with( tags, options = {} ) * tag_counts( options = {} ) Get Tags: {{{ >> p = Photo.find(:first) >> p.tag_list.to_s => "wedding vancouver summer" }}} Store Tags: {{{ >> p = Photo.find(:first) >> p.tag_list = "wedding vanouver summer" >> p.save }}} Add or Remove Tags: {{{ >> p.tag_list.add( "fun" ) >> p.tag_list.remove( "wedding" ) }}} Find Photos Tagged With: {{{ >> photos = Photo.find_tagged_with( 'summer' ) }}} Note: You can use options such as @:order@, @:limit@, @:offset@, etcetera Get Tag Counts for Tag Cloud: {{{ >> tags = Photo.tag_counts }}} h1. Add Tag Clouds To Your Web App Step 1: Add the Tag Cloud Helper to your App Step 2: Write the Controllers and Views Step 3: That's it. h1. Step 1: Add the Tag Cloud Helper to Your App @public/stylesheets/cloud.css@: {{{ .cloud1 {font-size: 100%;} .cloud2 {font-size: 120%;} .cloud3 {font-size: 140%;} .cloud4 {font-size: 160%;} .cloud5 {font-size: 180%;} .cloud6 {font-size: 200%;} .cloud7 {font-size: 220%;} }}} @app/helpers/application_helper.rb@: {{{ def tag_cloud( tags ) classes = %w(cloud1 cloud2 cloud3 cloud4 cloud5 cloud6 cloud7) max, min = 0, 0 tags.each { |t| max = t.count.to_i if t.count.to_i > max min = t.count.to_i if t.count.to_i < min } divisor = ((max - min) / classes.size) + 1 tags.each { |t| yield t.name, classes[(t.count.to_i - min) / divisor] } end }}} h1. Step 2: Write the Tags Controller and View @app/controllers/tags_controller.rb@: {{{ class TagsController < ApplicationController def index @tags = Photo.tag_counts( :order => "name" ) end end }}} @app/views/tags/index.rhtml@: {{{ <% tag_cloud @tags do |name, css_class| %> <%= link_to name, {:action => :tag, :id => name}, :class => css_class %> <% end %> }}} h1. Plugin Optimizations & Options Create Database Index for Taggings Table {{{ add_index :taggings, :tag_id add_index :taggings, [:taggable_id, :taggable_type] }}} Add Cached Tag List Table Column {{{ t.column :cached_tag_list, :string # tells plugin to cache taglist }}} Tag Seperator/Delimiter {{{ TagList.delimiter = " " # use space or comma }}} h1. Rails Tagging Plugin Choices * @acts_as_taggable@ Gem by Dirk Elmendorf * @acts_as_taggable@ Plugin by David Heinemeier Hansson (Prototype - Not Production Ready) * @acts_as_taggable_on_steroids@ Plugin by Jonathan Viney * @acts_as_taggable_redux@ Plugin by Wesley Beary * @scalable_acts_as_taggable@ Plugin by Matthew Carr * @has_many_polymorphs@ Plugin h1. Free Online Articles and Chapters About Tagging * Oracle Tech Net Article: "Tagging with Oracle and Ruby on Rails":http://www.oracle.com/technology/pub/articles/kern-rails-tagging.html by Matt Kern (June 2007) * Practical Rails Social Networking Sites Book by Alan Bradburne (June 2007): Free Sample Chapter 10 - "Adding Tags to the Photo Gallery":http://www.apress.com/book/view/1590598415 h1. That's it - Thanks! Questions? Comments? More User Groups/Sites * "Vancouver Ajax/Web 2.0 Developer Group":http://vanajax.com * "Vancouver Groovy/Grails User Group":http://groovyvan.com * "Vancouver Ruby/Rails Central Site":http://vanrb.com - One Stop Source for Ruby/Rails News, Events & Jobs