読者です 読者をやめる 読者になる 読者になる

Rails3でタグ付けの実装

acts-as-taggable-on rails3

Rails3でタグ付けをしたくて、探してみたところacts-as-taggable-onって
gemが良さそうだったので使ってみました。実装手順をメモっておきます。

mbleigh/acts-as-taggable-on · GitHub

インストール

Gemfile

gem 'acts-as-taggable-on'

タグ関連テーブルを作るマイグレーションを生成します。

$ rails g acts_as_taggable_on:migration 

タグ付けするモデル(Memo)

$ rails g scaffold Memo title:string content:text
$ rake db:migrate

app/models/mome.rb

class Memo < ActiveRecord::Base
  acts_as_taggable
  
  (以下、省略)  
end

動作確認

コンソール(rails c)から確認しました。

> @memo = Memo.new(:title => 'hoge', :content => :fuga)
> @memo.tag_list = "tag_1, tag_2" #=> "tag_1, tag_2" 
> @memo.save!

> @memo.tags #=> [#<ActsAsTaggableOn::Tag id: 1, name: "tag_1">, #<ActsAsTaggableOn::Tag id: 2, name: "tag_2">] 
> @memo.tag_list #=> ["tag_1", "tag_2"] 

タグクラウド

タグ付けできるようになったら、タグクラウドを表示できるようにしてみます。

app/helpers/memo_helper.rb

module MemosHelper
  include ActsAsTaggableOn::TagsHelper
end


app/views/momos/index.html.erb

<h1>Listing memos</h1>

<%= link_to '全て表示', [:memos] %>
<% tag_cloud(Memo.tag_counts_on(:tags), %w(css1 css2 css3 css4)) do |tag, css_class| %>
  <%= link_to tag.name, { :action => :tag, :name => tag.name }, :class => css_class %>
<% end %>


public/scaffold.css(デザインは必要であれば変更してください)

/* タグクラウド */
.css1 { font-size: 1.0em; }
.css2 { font-size: 1.2em; }
.css3 { font-size: 1.4em; }
.css4 { font-size: 1.6em; }


app/controllers/momos_controller.rb

class MemosController < ApplicationController

  # GET /memos
  # GET /memos.xml
  def index
    @memos = Memo.all
    @tags = Memo.tag_counts_on(:tags)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @memos }
    end
  end

  def tag
    @memos = Memo.tagged_with(params[:name])
    @tags = Memo.tag_counts_on(:tags)
    
    render 'index'
  end
  
  (以下、省略) 
end


config/routes.rb

Memotter::Application.routes.draw do
  # resources :memos
  resources :memos do # => tagアクションを追加しました。
    collection do
      get 'tag'
    end
  end