Acts as tagable on
ナビゲーションに移動
検索に移動
インストール
Gemfileに追加
gem 'acts-as-taggable-on'
インストール
> bundle install (中略) Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed. Post-install message from acts-as-taggable-on: When upgrading Re-run the migrations generator rake acts_as_taggable_on_engine:install:migrations It will create any new migrations and skip existing ones ##Breaking changes: - ActsAsTaggableOn::Tag is not extend with ActsAsTaggableOn::Utils anymore. Please use ActsAsTaggableOn::Utils instead
書かれているとおりにする。
> rake acts_as_taggable_on_engine:install:migrations (中略) > rake db:migrate
設定
この例では、imageモデルに適用しているので、/app/models/images.rb
にacts_as_taggable
を追加。
class Image < ActiveRecord::Base acts_as_taggable end
コントローラーを編集
/app/controllers/images_controller.rb
を編集します。
def indexを編集
編集前
def index @images = Image.all end
編集後
def index @tags = Image.tag_counts if params[:tag].present? @images = Image.tagged_with(params[:tag]).order('id DESC').page(params[:page]).per(10) else @images = Image.order('id DESC').page(params[:page]).per(10) end end
.page(params[:page]).per(10)
の部分は、kaminari使ってるので、その設定も入ってます。
def createとdef updateを、編集
def create
と、def update
に@image.tag_list = params[:image][:tag_list]
を追加。
def create @image = Image.new(image_params) @image.tag_list = params[:image][:tag_list] (中略) def update @image.tag_list = params[:image][:tag_list] (中略) def image_params params.require(:image).permit(:memo, :title, :imgurl, :tag_list)
タグを表示する
index.html.erb
になら、@images
やimage
はモデル名で変わります。
<% @images.each do |image| %> (中略) <% image.tags.each do |tag| %> <%= link_to(tag.name, images_path(tag: tag.name)) %> <% end %><br>
show.html.erb
には、
<% @image.tags.each do |tag| %> <%= link_to tag.name, images_path(tag: tag.name) %> <% end %>
_form.html.erb
には、
<div class="field"> <%= f.label :tag_list %><br> <%= f.text_field :tag_list %> </div>
を追加します。
タグクラウド
表示させるテンプレートに追加。Image
というモデルなのでImage
やimages
は環境に合わせて変更する必要があります。
<div id="tag_cloud"> <% tag_cloud Image.tag_counts, %w{s m l} do |tag, css_class| %> <%= link_to tag.name, images_path(tag: tag.name), class: css_class %> <% end %> </div>
images.css.scss
ファイルにタグクラウド用の記載を追加。
#tag_cloud { width: 100%; line-height: 1.6em; .s { font-size: 0.8em; } .m { font-size: 1.2em; } .l { font-size: 1.8em; } }
複数のタグを指定してオブジェクトを取得する
標準
items = Item.find_tagged_with("テント, タープ") # => 「テント」もしくは「タープ」のいずれかのタグを持つレコードを取得
AND検索するには、option
で、:match_all => true
を指定する。
items = Item.find_tagged_with("テント, 本体", :match_all => true) # => 「テント」でかつ「本体」両方のタグを持つレコードを取得