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à ...
Để 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.
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_rate là false.
-
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_half là true 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!