IT技術にまつわる実験ノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

acts-as-taggable-on を使ってみる

はじめに

ここでは、以下の記事を参考にして acts-as-taggable-on を使ってみることにする。

 

使ってみる

まずは、ざっくりとアプリを作成する。

  • rails new tag_sample
  • cd tag_sample

 

gem をインストールする。

  • echo "gem 'acts-as-taggable-on', '~> 6.0'" >> Gemfile
  • bundle

 

マイグレーションを実行する。

  • bin/rails acts_as_taggable_on_engine:install:migrations
  • bin/rails db:migrate

 

db/schema.rb を確認してみる。

タグに関して、以下のような設定になっている。

f:id:matt-note:20190415174435p:plain


サンプル用に Restaurant モデルを作成する。

  • bin/rails g scaffold Restaurant name:string description:string
  • bin/rails db:migrate

 

app/model/restaurant.rb で act_as_taggable メソッドを呼び出す。

f:id:matt-note:20190218131925p:plain

 

app/controllers/restaurants_controller.rb の Strong Parameters で、ユーザーの入力から :tag_list を受け取れるようにする。

f:id:matt-note:20190218132244p:plain

 

タグ付きのデータを作成してみる。

f:id:matt-note:20190218140534p:plain

 

index.html.erb を編集する。

f:id:matt-note:20190218140736p:plain

f:id:matt-note:20190218140744p:plain

 

サーバーを起動して、アクセスしてみる。

f:id:matt-note:20190218140845p:plain

-> ざっくりとタグを登録して、表示できた。

 

フォームからデータを入力できるようにする

データ入力用に、_form.html.erb を編集しておく。

f:id:matt-note:20190218151113p:plain

f:id:matt-note:20190218154257p:plain

f:id:matt-note:20190218154311p:plain

 

タグをリンクにしてみる

index.html.erb を以下のように編集する。

f:id:matt-note:20190218142140p:plain

 

これによって、以下のようなパスが作成される。

f:id:matt-note:20190218142310p:plain

 

config/routes.rb を編集して、タグのパスを作成する。

f:id:matt-note:20190218142435p:plain

 

restaurants_controller.rb を編集する。

f:id:matt-note:20190218150634p:plain

 

views/restaurants/tagged.html.erb をざっくりと作成する。

f:id:matt-note:20190218150716p:plain

f:id:matt-note:20190218154339p:plain

 

タグの入力をスペース区切りにしてみる

設定ファイルを作成する。【参考:https://github.com/mbleigh/acts-as-taggable-on/wiki#configuration

  • touch config/initializers/acts_as_taggable_on.rb

 

スペースで区切るように設定する。

f:id:matt-note:20190415135746p:plain

 

設定を追加したら、サーバーを再起動して、設定を反映させる。

これでスペース区切りでタグを入力できるようになる。

 

区切る文字を複数指定したい場合は、配列を渡す。

この時に、配列内の文字列を区切るカンマの後にスペースを入れると、うまく動作しない。

f:id:matt-note:20190415141300p:plain

 

 

なお、acts_as_taggable_on を使うと、N+1 問題が発生するため、対処する必要があるとのこと。【参考:RubyonRails:acts-as-taggable-onのN+1問題を解決する - Madogiwa Blog

 

acts_as_taggable_on は、gitlabhq や dev.to などで使用されている。