機能 ショートカットキー
リファレンス(参考URL)一覧へ移動 R
記事URLをMarkDownとしてコピー Ctrl+M
前のコードタグへ移動 Ctrl+←
次のコードタグへ移動 Ctrl+→
ヘルプを表示・非表示 H
Tips
- ショートカットキーは記事上で有効です。ヘッダー/フッター付近では機能しないことがあります。
- コードタグ移動機能がうまく動かないときは、Shift+F5でページを更新してみてください。
- このウィンドウを閉じるには、Hキーをもう一度押してください

Railsプラグインacts-as-taggable-onでタギング/タグ機能を実装

AD

プログラミング

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"のようにコンマ区切りの文字列として複数タグを定義することもできる。
コンマではなく、|などを使用したい場合は、区切り文字を定義することもできる。:参考:Tag Parsers

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>

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_dc23e5e5-8103-428e-bb6f-23d6e6bb7675.png

ref:

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つ見とけば大丈夫。

検索機能の実装はまた後日。

SPONSOR

オンラインブートキャンプ全12コースの「ウケ放題」 AD

コメントを残す

Close Menu