Hatena::ブログ(Diary)

kano-e no memo Twitter

2007年06月07日

[] acts_as_taggable_on_steroids

区切り文字の指定について、間違ってたので修正しました。

Tag.delimiterでなくて、TagList.delimiterです。

tkskkcさん、ご指摘ありがとうございます。

なんでこんな間違いしたのかなーと思って調べたのですが、Tag.delimiterは古いバージョンでの書き方で、[26 August 2006]時点でTagList.delimiterに置き換えられたようです。

参考:acts_as_taggable_on_steroids/CHANGELOG

これ書いた時、古い記述を参考にしてたうえに、自分でよく確かめもしなかったのが原因でした。

反省。

前々から、acts_as_taggableを試そうと思いつつ、なかなか機会がなかったんですが(最近SQLエネルギー傾け気味だったし)、今日ようやく試しました。

と、言いつつ。

調べたらrailsでタグを実装するpluginも色々あるらしい?

no title

acts_as_taggable_on_steroidsとacts_as_taggable_reduxで、それぞれちょっと違うらしい。

とりあえず。

no titleを読んで参考にしまくりつつ、on_steroidsの方を試すことに。

ruby script/plugin install 
http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids/
script/generate migration add_tag_support

migrateファイルの中身は、まるっきりコピペ

class AddTagSupport < ActiveRecord::Migration
  def self.up
    #Table for your Tags
    create_table :tags do |t|
      t.column :name, :string
    end

    create_table :taggings do |t|
      t.column :tag_id, :integer
      #id of tagged object
      t.column :taggable_id, :integer
      #type of object tagged
      t.column :taggable_type, :string
    end

    # Index your tags/taggings
    add_index :tags, :name
    add_index :taggings, [:tag_id, :taggable_id, :taggable_type]
  end

  def self.down
    drop_table :taggings
    drop_table :tags
  end
end

そしたらmigrate

rake db:migrate

これで、準備完了?

実際にどうやって使うの?ってことで、no titleを確認。

試しに例の通りにBookというモデルをつくって、そこに適用させてみることに。

class Book < ActiveRecord::Base
  acts_as_taggable
end

BookControllerはscaffoldでさくっと作った。

とりあえず、フォームにタグ入力部分を追加する。

_form.rhtmlの一番下に、こっそりつけくわえる。

<%= text_field 'item', 'tag_list' %>

で、createの、

@book = Book.new(params[:book])
if @book.save

のところを

@book = Book.new(params[:book])
@book.tag_with(params[:tag_list])
if @book.save

と、いうふうにしてみた。

そしたら、なぜだかエラー。tag_withなんてメソッド知らないよ、とか言われてしまう。

@book.methodsとか調べてみたけど、確かにtag_withというメソッドは見つからない。

色々悩んだ末、ふと、acts_as_taggable_on_steroidsのREADMEを見たら、

p = Post.find(:first)

p.tag_list # ""

p.tag_list = "Funny, Silly"

p.save

p.reload.tag_list # "Funny, Silly"

って書いてあったので、試しにさっきのところを

@book = Book.new(params[:book])
@book.tag_list = params[:tag_list]
if @book.save

と書き換えたら、すんなり動いた。

なんでtag_with駄目なの……? と、少し悩んだけど、まあ今回は動いたから良しということに。

で。

区切り文字は、environment.rbで

TagList.delimiter = ","

とかで指定できるのか。指定しない場合は、","(半角カンマ)がデフォルトなのね。

あとは。

Book.find_tag_with(tag_name, option)で、tag_nameで指定したタグをつけられているのだけ拾ってくるとか。

Book.tag_count(option)で、[{:name => tag_name, :id => tag_id, :count => count}, ...]な感じでタグ毎の集計が返ってくる。

楽しい、楽しい。

acts_as_taggable_reduxの方はもっとお手軽らしいので、そっちも今度試してみよう。

だらだらと書いてしまった。

tkskkctkskkc 2007/12/13 22:59 Tag.delimiter= ではなく、TagList.delimiter= のようです

kano-ekano-e 2007/12/14 11:20 おわ、本当だ。
READMEにばっちりTagList.delimiter=って書いてあるのにorz
ご指摘ありがとうございます。
修正します。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

Connection: close