12/08/2018, 14:49

Tagging trên Rails với gem acts-as-taggable-on

đối với những hệ thống CMS hay các blog thì tagging là một trong những chức năng thiết yếu và quan trọng. Để giúp các bạn xây dựng chức năng tagging nhanh chóng và hiệu quả hơn. Hôm nay mình xin giới thiệu gem "acts-as-taggable-on". Cài đặt Khai báo gem trong Gemfile Gemfile gem ...

đối với những hệ thống CMS hay các blog thì tagging là một trong những chức năng thiết yếu và quan trọng. Để giúp các bạn xây dựng chức năng tagging nhanh chóng và hiệu quả hơn. Hôm nay mình xin giới thiệu gem "acts-as-taggable-on".

  1. Cài đặt Khai báo gem trong Gemfile
Gemfile
gem 'acts-as-taggable-on'

chạy lệnh sau trên terminal để cài đặt gem

Terminal
rails g acts_as_taggable_on:migration
rake db:migrate

Nếu bạn sử dụng MySql thì bạn cần thêm dòng sau vào file initializer

ActsAsTaggableOn.force_binary_collation = true

hoặc chạy rake task sau

rake acts_as_taggable_on_engine:tag_names:collate_bin
  1. Sử dụng trước tiên chúng ta cần setup cho model sử dụng tag. Ở đây tôi sẽ sử dụng tag cho model Article, tôi sẽ thêm acts_as_taggable và attr_accessible vào model Article như sau:
class Article < ApplicationRecord
  acts_as_taggable
  attr_accessible :tag_list
end

thêm trường tag_list vào form article

<div class="field">
  <%= f.label :tag_list, "Tags (separated by commas)" %><br />
  <%= f.text_field :tag_list %>
</div>

và bây giờ bạn đã có thể tạo mới và chỉnh sửa tag cho article. Nếu muốn tạo/sửa nhiều tag cùng một lúc bạn chỉ cần thêm đấu "," giữa các tag. Đó là tạo mới và chỉnh sửa tag, còn lấy ra các tag của một article và lấy ra những article chứa một tag thì thế nào? rất đơn giản vì acts-as-taggable-on cung cấp hàm tag_list để lấy ra các tag thuộc article và hàm tagged_with để lấy ra các article chứa tag Ví dụ, bạn muốn hiển thị tất cả tag thuộc article:

_article.html.erb
raw article.tag_list.map { |t| link_to t, tag_path(t) }.join(', ')

Hoặc lấy ra danh sách các article có chứa tag trên controller

Controller
def index
  if params[:tag]
    @articles = Article.tagged_with(params[:tag])
  else
    @articles = Article.all
  end
end

Ngoài ra Acts-as-taggable-on còn cung cấp một tính năng rất tuyệt vời khác là tag_cloud có khả năng tự list ra những từ khoá phổ biến liên quan đến nội dung của article đó. Để sử dụng tag_cloud, các bạn chỉ cần làm như sau:

View
<div id="tag_cloud">
  <% tag_cloud Article.tag_counts, %w[s m l] do |tag, css_class| %>
    <%= link_to tag.name, tag_path(tag.name), class: css_class %>
  <% end %>
</div>

viết CSS cho tag_cloud

#tag_cloud {
  awidth: 400px;
  line-height: 1.6em;
  .s { font-size: 0.8em; }
  .m { font-size: 1.2em; }
  .l { font-size: 1.8em; }
}

Tim kiếm tag được sử dụng nhiều/ít nhất Bạn có thể tìm ra tag được sử dụng dụng nhiều nhất hoặc ít nhất bằng cách:

ActsAsTaggableOn::Tag.most_used
ActsAsTaggableOn::Tag.least_used

bạn còn có thể litmit số lượng tag bằng cách truyền một số dương cho hàm Tag.most_used và Tag.least_used

ActsAsTaggableOn::Tag.most_used(10)
ActsAsTaggableOn::Tag.least_used(10)

Trên đây là bài giới thiệu ngắn gọn của tôi về gem "Acts-as-taggable-on". Cảm ơn các bạn đã theo dõi. tham khảo: http://railscasts.com/episodes/382-tagging?autoplay=true https://github.com/mbleigh/acts-as-taggable-on

0