- Published on
Railsプラグインacts-as-taggable-onでタグ機能を実装
- Authors
- Name
- Shou Arisaka nyapp.buzz/shou
- short bio
- Z世代の情報技術者。Next.jsで自作SNSを個人開発中。
Ruby on Railsのプラグインacts-as-taggable-onを使って、タグ機能を実装します。
acts-as-taggable-on使ってできること
- タグ一覧ページ
- 個別タグページ;タグAが付けられたモデル情報を表示する(説明しづらい)
- タグ検索(OR検索/AND検索/マイナス検索etc)(集合演算で他の検索機構と合わせ技も可能)
- 複数タグを追加/削除;モデルインスタンスごとのタグを一括で追加したり編集したりできる。ニコニコ動画のタグ編集を想像してもらえればいいかと。
たぶん皆さんが実装したいと思ってることは大抵なんでもできる。 このプラグイン、結構すごいです。 自分で一からタグ実装したりとか絶対できないです……。
実装
インストール# add gemfile
gem 'acts-as-taggable-on', '~> 6.0'
# commands
bundle install
rake acts_as_taggable_on_engine:install:migrations
rake db:migrate
コントローラーとモデルを編集する
class User < ActiveRecord::Base
acts_as_taggable # Alias for acts_as_taggable_on :tags
acts_as_taggable_on :skills, :interests
end
class UsersController < ApplicationController
def user_params
params.require(:user).permit(:name, :tag_list) ## Rails 4 strong params usage
end
end
Mysqlだともう少し設定が必要みたいですが割愛。
rails cで検証。
@user = User.new(:name => "Bobby")
@user.tag_list.add("awesome") # add a single tag. alias for <<
@user.tag_list.remove("awesome") # remove a single tag
@user.save # save to persist tag_list
具体例
@hashmodel = Hashmodel.find(1)
@hashmodel.tag_list = "hoge,fuga"
@hashmodel.save
Hashmodel.find(1).tag_list #=> ["hoge", "fuga"]
Hashmodel.find(6).tag_list #=> ["foo", "fuga"]
Hashmodel.tagged_with("fuga").by_join_date.ids
"hoge,fuga"
のようにコンマ区切りの文字列として複数タグを定義することもできる。
コンマではなく、|
などを使用したい場合は、区切り文字を定義することもできる。
Finding Tagged Objects
検索機能実装などに使えそうなメソッドとか。公式リファレンスにはscope :by_join_date, order("created_at DESC")
と書いてあるが、これはActiveRecordの古いバージョンの記述なので、動作しない。 これを正しく書くと、scope :by_join_date , -> {order(created_at: :DESC)}
となる。参考にしてほしい。
# Userモデルのタグ"awesome"を含んだオブジェクトを返す
User.tagged_with("awesome").by_join_date
# e.g. Hashmodel.tagged_with("fuga")[0].id
# => 1
# Hashmodel.tagged_with("fuga,hoge")[0].id
# 配列ではなくコンマ区切り文字列でもOK
# 全てのタグを含むオブジェクトを返す(AND検索)
User.tagged_with(["awesome", "cool"], :match_all => true)
# 1つでもマッチすれば(OR検索)
User.tagged_with(["awesome", "cool"], :any => true)
# 除外;タグを含まない
User.tagged_with(["awesome", "cool"], :exclude => true)
タグ一覧とか個別タグページを実装する
コントローラーの生成と設定rails g controller tags index show
class TagsController < ApplicationController
def index
@tags = ActsAsTaggableOn::Tag.all
end
def show
@tag = ActsAsTaggableOn::Tag.find(params[:id])
@posts = Hashmodel.tagged_with(@tag.name)
end
end
見て分かる通り、ActsAsTaggableOn::Tag
がモデルになる。
- VIEWの一例
app\views\tags\index.html.erb
<h1>Tags List</h1>
<table>
<thead>
<tr>
<th>Tag Name</th>
<th>Tag count</th>
<!-- <th colspan="3"></th> -->
</tr>
</thead>
<tbody>
<% @tags.each do |tag| %>
<tr>
<td><%= tag.name %></td>
<td><%= tag.taggings_count %></td>
</tr>
<% end %>
</tbody>
</table>
app\views\tags\show.html.erb
<h1>Tag::<%= @tag.name %></h1>
<ul>
<% @posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
</ul>
参考:
mbleigh/acts-as-taggable-on: A tagging plugin for Rails applications that allows for custom tagging along dynamic contexts. Tutorial for Posts · mbleigh/acts-as-taggable-on Wikiこの2つ見とけば大丈夫。
検索機能の実装はまた後日。
15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。