Search code examples
ruby-on-railsacts-as-taggable-on

How to display a tag cloud from Acts as Taggable On on an index page in Ruby on Rails 3.2.7?


I'm very new to Ruby on Rails, so there's probably a simple solution I'm missing.

The tldr version - how do I display an Acts As Taggable On tag cloud of distinct (i.e. no repeating) tags assigned to all instances of a particular model on that model's index page?

The longer version - I have a model called Video in which I have successfully managed to implement a tagging feature using Acts as Taggable On and this fantastic tutorial.

What I'd like to do now is, on the Video's index page (index.html.erb), to display a summary of all the individual tags that a user has assigned to individual videos. For example, lets say I have three videos, each tagged as follows:

Video 1: great, banana, book
Video 2: small, great, apple
Video 3: rubbish, small, banana

I'd like the index page to display the following list of tags:

great, banana, book, small, apple, rubbish.

The code for my model (elided) is as follows:

class Video < ActiveRecord::Base

attr_accessible :tag_list # Lots of other fields in here as well, but not relevant

acts_as_taggable_on :tags

end

The code in my Video helper is as follows:

module VideosHelper

  include ActsAsTaggableOn::TagsHelper

end

Finally, as per the gem's documentation, I've added the following code to my controller:

class VideosController < ApplicationController
  def tag_cloud
    @tags = Video.tag_counts_on(:tags)
  end
end

So, what code should I be adding to the index page of my view? I tried the following, again as per the documentation:

<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
  <%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>

But this returns the following error when I go to the Video index page:

undefined method `empty?' for nil:NilClass

As I say, I'm obviously missing something simple, but I'm completely new to Rails (and Ruby) so I'm still finding my feet.


Solution

  • OK, after hacking about a bit, I think I've found a solution, in case anyone else wondering how to do this happens to stumble across this question.

    However, please be aware that I am very much a beginner at RoR, so this is probably not the best solution - if I'm doing anything wrong, or if you have a better solution, feel free to let me know!

    Add this code in your view to display the list of tags for a particular model in order:

    @tags = ActsAsTaggableOn::Tag.all(:order=>'name')
    
    <% if @tags.count > 0 %>
      <ul>
        <% @tags.each do |tag| %>
          <li><%= link_to tag.name, tagged_url(:tag => tag.name) %></li>
        <% end %>
      </ul>
    <% else %>
      <p>There are no tags on the system.</p>
    <% end %>
    

    This results in a very basic display and, due to my inexperience I advise using this approach with caution - I'm sure it's not the best, or even the "safest", method, so beware!