Rating với ratyrate gem, đơn giản và đầy đủ hơn

Để xây dựng một trang web có tính tương tác với người dùng, mong muốn người dùng đưa ra được ý kiến, đánh giá của mình về một bài đăng/ một sản phẩm nào đó, developer thường phát triển tính năng Rating. Tuy nhiên, để xử lý cả đống sự kiện ajax cũng như lưu vào database nghe qua có vẻ khá vất vả và tốn công sức.

Thật may mắn, đã có ratyrate hỗ trợ chúng ta trong việc tạo một rating cho tran web của chúng ta. Tuy nhiên, với hướng dẫn của document thì khó lòng chúng ta có thể sử dụng và save vào database ngay được. Hôm nay, tôi sẽ giới thiệu đến các bạn cách cài đặt và sử dụng ratyrate trong Rails.

image

Cài đặt ratyrate

Trong Gemfile add vào gem :

gem "ratyrate"

sau đó chạy lệnh bundle

Tạo ratyrate

ví dụ với một model là tác nhân rating là user

rails g ratyrate user

sau khi chạy lệnh trên, các file javascript xử lý bắt sự kiện rating và xử lý ajax, images star, sinh ra rater_controller, rate model và các file migration để tạo các bảng rating mà tôi sẽ giải thích rõ hơn bên dưới.

Nếu bạn sử dụng gem devise (được khuyến khích), thì lần lượt chạy các lệnh sau:

rails g devise:install
rails g devise user

rails g ratyrate user

Trong project rails của bạn sẽ sinh ra các models Rate RatingCache, các migrations và link đến model user của bạn.

Sử dụng rake db:migrate để định dạng lại các tables trong project, sau khi add thêm bảng rating_caches vào.

Include vào javascript

//= require jquery.raty
//= require ratyrate

Tạo một model là target để rating

Ví dụ, ta sẽ tạo ra một bảng là Store

rails g model store name:string

Trong model store.rb chúng ta tạo ra ba khía cạnh mà chúng ta muốn rate của Store: "quality", "attitude", "price" , dĩ nhiên là chúng không nhất thiết phải là tên các columns của bảng Store, nghĩa là bạn nên đặt một cái tên "liên quan" đến Table mà bạn đang muốn rate.

class Store < ActiveRecord::Base
  ratyrate_rateable "quality", "attitude", "price"
end

Đây sẽ là ba trường mà bạn sẽ rate cho Store.

Tiếp theo, định nghĩa ratyrate_rater trong models user.rb

class User < ActiveRecord::Base
  ratyrate_rater
end

Sử dụng nó thế nào nhỉ?

Đơn giản thôi, trong views, bạn chỉ cần gọi

Quality  : <%= rating_for @store, "quality", star: 5 %>

giao diện của bạn bây giờ sẽ hiện ra 5 stars (ở chế độ off) chưa được rate, để cho bạn có thể rate ngay bây giờ.

Bạn đặt câu hỏi: "như vậy đã sử dụng được chức năng rating trong trang web của tôi chưa?".

Câu trả lời là: " Rồi đấy!".

À mà khoan, hãy chú ý login trước nhé, bởi vì ratyrate sẽ check login trước khi rate trong RaterController : raters_controller.rb

class RaterController < ApplicationController

  def create
    if user_signed_in?
      obj = params[:klass].classify.constantize.find(params[:id])
      obj.rate params[:score].to_f, current_user, params[:dimension]

      render :json => true
    else
      render :json => false
    end
  end
end

Bây giờ thì bạn có thể rate được rồi đấy.

Tuy nhiên, bạn vẫn phải biết thêm các options để sử dụng rating một cách linh hoạt và hiệu quả nhất.

  • disable_after_rate - mặc định là true
Quality  : <%= rating_for @store, "quality", disable_after_rate: true  %>

Điều đó nghĩa là bạn chỉ có thể rate một lần, các star sẽ ẩn đi để bạn không thể làm lại công việc rate cho một target một lần nữa.

Nếu muốn cho phép người dùng có thể thay đổi rating, đơn giản thôi, bạn sửa option disable_after_ratefalse.

  • enable_half - mặc định sẽ là false Nếu muốn chấm điểm với 1/2 star, bạn sửa option enable_halftrue và ngược lại

  • half_show - mặc định là true

Nếu muốn hiển thị với 1/2 star, đổi thành false nếu chỉ muốn rate với các stars hoàn chỉnh.

  • cancel - mặc định là false

Muốn hiển thị nút cancel điểm rating đi, đổi thành cancel: true

  • cancel_place - mặc định là left

Mặc định nút cancel sẽ hiển thị bên trái các stars, đổi thành cancel_place: right để nó hiển thị ở bên phải.

Ngoài ra, các bạn có thể tham khảo thêm các options cho rating trong helpers của ratyrate ratyrate-helpers

Other helpers

Ngoài cách sử dụng rating theo rating_for_user

Quality  : <%= rating_for @store, "quality", star: 5 %>

Ta có thể sử dụng theo cách imdb_style_rating_for

Quality : <%= imdb_style_rating_for @store, current_user %>

Xong chưa?

Dĩ nhiên là chưa, sau khi rating, bạn thắc mắc đã lưu và database chưa, làm thế nào để lấy được điểm rate, điểm rate trung bình, số lượng rater ...

Bây giờ tôi sẽ chỉ cho bạn làm thế nào để ta có được chúng.

  • Điểm rating trung bình:
@store.average("quality").avg
  • Tổng số rater
@store.rates("quality").count
  • Nếu muốn lấy điểm rating mới nhất, bạn có thể gọi ra:
@store.rates("quality").last.stars

Đến đây, bạn đã tạo xong chức năng rating cho trang web của mình rồi đấy. Ngoài ra hãy tham khảo thêm, và vận dụng những kĩ năng code của mình để có được sản phẩm ưng ý nhất nhé

Thân ái!