acts_as_taggable_on でユーザーごとにタグを設定する方法

タグをユーザーごとに管理したいんだけど、acts_as_taggable_on では出来ないんだろうな、って勝手に思い込んでいたら、ReadMe に方法書いてあった。英語だからって拒否反応起こしてないで、ちゃんと ReadMe ぐらい読んでおけよ、自分。

ReadMe に書いてあること忘れそうなので、方法をブログにメモしておく。

タグを付けたいクラスを用意する

class Entry < ActiveRecord::Base
  acts_as_taggable
  
  belongs_to :user
  ...
end

ユーザークラスを修正する

class User < ActiveRecord::Base
  ...

  # 追加
  acts_as_tagger
end

タグを付けるとき

class EntriesController < ApplicationController
  ...

  def create
    @entry = Task.new(params[:task])
    @entry.user = current_user
    @entry.save

    current_user.tag(@entry, :with => params[:tag_list], :on => :tags)

    respond_with @entry
  end

  ...
end

:with に指定しているのは、タグ文字列。
:on で指定しているのは、acts_as_taggable_on で宣言したときに指定した名前(?)。acts_as_taggable で宣言したときは、デフォルトで tags になるんだけど、ここではいちいち指定しないといけない。

ユーザーが付けたタグを取得するとき

class EntriesController < ApplicationController
  ...
  
  def show
    @entry = Entry.find(params[:id])

    # ログインユーザーが付けたタグを取得
    @tags = @entry.tags_from(current_user)

    respond_with @entry
  end

  ...
end