今回すること
タグを簡単に管理することができるgem act-as-taggable-onを使ってあるモデル(今回はprototype)を投稿する時、同時に複数のタグをつけられるようにします。
使用するファイル
- gemfile
- prototype.rb
- prototypes_controlloer.rb
- tags_controller.rb
- prototype.new.html.haml
- prototype/show.html.haml
- prototype/show.html.haml
- tags/index.html.haml
やり方
###1 gemのインストール
gem 'acts-as-taggable-on', '~> 3.4'
###2 tagsテーブルを作成する
bin/rake acts_as_taggable_on_engine:install:migrations
bin/rake db:migrate
###3 モデルにacts-as-taggable-onを追加する
acts-as-taggable-on :prototypes
この設定で下記のメソッド
prototype.tag_list
が使えるようになります。
###4 入力フォームを作成する
=form_for(@prototype) do |f|
= text_field_tag "prototype[tag][]", "", placeholder: "Web Design"
= text_field_tag "prototype[tag][]", "", placeholder: "UI"
= text_field_tag "prototype[tag][]", "", placeholder: "Application"
= f.submit "投稿する"
= text_field_tag "prototype[tag][]"
ここでtagの後に[](空の配列)を使うことでタグを投稿したときに配列で扱うことができるようになります。
###5 ストロングパラメータを設定する
params.require(:prototype).permit(:title, :catch_copy, :concept, :user_id).merge(tag_list: params[:prototype][:tag])
###6 入力したタグを表示する
def index
@tags = ActsAsTaggableOn::Tag.most_used
end
ActsAsTaggableOn::Tag.most_used
で最も使われているタグを取得することができます。most_usedに引数を渡すとその件数分取ってきますが、デフォルトでは20件取ってきます。
タグ一覧ページ
acts_as_ordered_taggable_on :prototypes
タグ一覧ページで、タグが多い順に表示するようにします。
- @tags.each do |tag|
= link_to "#{tag.name}", tag_path(tag.id)
= link_to tag_path(tag.id) do
%i "#{tag.taggings.count}" Projects
link_toを入れ子にするときは、中のlink_toに do をつけ、第一引数をpathにします。
#### プロトタイプ表示ページ
%ul
- prototype.tags.each do |tag|
%li
=link_to "#{tag.name}", tag_path(tag.id)
##参考
http://ruby-rails.hatenadiary.com/entry/20150225/1424858414
(acts-as-taggable-on)
http://webos-goodies.jp/archives/51387214.html
(paramsを配列で扱う)