Graeme
Graeme

Reputation: 481

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.

Upvotes: 1

Views: 1532

Answers (1)

Graeme
Graeme

Reputation: 481

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!

Upvotes: 3

Related Questions