12/08/2018, 15:44

Đếm lượt view page bằng gem impressionist

Bạn muốn đếm số lượt view 1 trang, 1 sản phẩm, hay thậm chí đếm số lượt thực hiện 1 action nào đó. Bạn có thể thực hiện 1 cách thủ công bằng cách +1 vào 1 trường quy định số view trong db, nhưng như vậy thì việc config sẽ gặp nhiều rắc rối. Để việc đó trở nên dễ dàng hơn, tôi sẽ giớ thiệu cho bạn 1 ...

Bạn muốn đếm số lượt view 1 trang, 1 sản phẩm, hay thậm chí đếm số lượt thực hiện 1 action nào đó. Bạn có thể thực hiện 1 cách thủ công bằng cách +1 vào 1 trường quy định số view trong db, nhưng như vậy thì việc config sẽ gặp nhiều rắc rối. Để việc đó trở nên dễ dàng hơn, tôi sẽ giớ thiệu cho bạn 1 gem khá hữu ích cho việc này: gem impressionist

Thêm vào Gemfile

gem "impressionist"

Chạy lệnh Bundler

bundle install

Chạy lệnh generate

rails g impressionist

Chạy lệnh migration

rake db:migrate

thêm 1 cột trong bảng

rails g migration AddImpressionsCountToBook impressions_count:int

1.Ghi log tất các actions trong controller

 WidgetsController < ApplicationController
   impressionist
 end

2.Ghi log 1 action đặc biệt nào đó của controller

 WidgetsController < ApplicationController
   impressionist actions: [:show,:index]
 end

3 Chắc chắn trong model của bạn đã được thêm

 class Widget < ActiveRecord::Base
   is_impressionable
 end

Sau khi thêm xong, giờ bạn có thể ghi log bất kì object nào của model với hành động tùy ý

 def show
   @widget = Widget.find
   impressionist(@widget, "message...") # 2nd argument is optional
 end

4 Lấy số lượng log đã ghi được

@widget.impressionist_count @widget.impressionist_count(start_date: "2011-01-01", end_date: "2011-01-05") @widget.impressionist_count(start_date: "2011-01-01") # end date = now @widget.impressionist_count(filter: :ip_address) #filter theo địa chỉ ip @widget.impressionist_count(filter: :params) #filter theo param đặc biệc nào đó @widget.impressionist_count(:ilter: :session_hash) #filter theo session đăng nhập của user

Những phần trên ghi log lại đều có thể bị trùng lặp, vậy nên bạn có thể sử dụng 1 số config sau để tránh trùng lặp

Chỉ ghi log với những request không trùng type, id, session impressionist unique: [:impressionable_type, :impressionable_id, :session_hash]

Chỉ ghi log với những request không trùng controller, action, và session impressionist unique: [:controller_name, :action_name, :session_hash]

Hoặc đơn giản hơn là chỉ ghi log theo từng phiên làm việc impressionist unique: [:session_hash]

Chỉ ghi log với những request không trùng param impressionist :unique => [:params]

Bài viết mang tính giới thiệu, có điều gì sai sót mong bạn đọc bỏ qua

0