+1

Ratyrate: Thêm chức năng Rating cho ứng dụng Rails

Bài viết hướng dẫn cách thêm chức năng đánh giá (Rating) vào một ứng dụng Rails, sử dụng cùng một ứng dụng được sử dụng trong store trực tuyến của Karim El Hussieny, trong đó, các bước tạo ứng dụng cơ bản được giải thích chi tiết. Hãy tham khảo bài viết đó để tìm hiểu cách Karim xây dựng ứng dụng và phong cách của ứng dụng cơ bản.

Mục tiêu

Ứng dụng của chúng ta là một cửa hàng trực tuyến các bộ phim. Chúng ta cần thêm chức năng rating cho mỗi bộ phim. Người dùng có thể đánh giá cho các bộ phim có sẵn trong cửa hàng. Sau đó, mỗi bộ phim sẽ được đánh giá dựa trên tất cả những đánh giá của người dùng, tương tự cách IMDB làm.

Đặc điểm chính

  • Rating phim: Rating của phim trong cửa hàng (Yêu cầu đăng nhập).
  • Hiển thị bảng đánh giá cho người dùng: Mỗi người dùng có thể truy cập vào bảng điều khiển của mình, xem phim và đánh giá. Có thể thay đổi đánh giá một phim bất cứ lúc nào.
  • Thay đổi số sao: số sao đánh giá có thể được thiết lập để phù hợp với tính chất của ứng dụng.
  • Điểm trung bình phim: Mỗi phim có một điểm trung bình được tính toán dựa trên tất cả đánh giá của người dùng. Tiêu chí để đánh giá phim có thể là: thời lượng phim, hiệu ứng hình ảnh, thiết kế, nội dung ...
  • Chức năng vô hiệu hóa đánh giá: Chức năng rating có thể bị vô hiệu hóa sau lần rate đầu tiên và chuyển sang chế độ readonly.
  • Tùy chỉnh các biểu tượng: Các icon ngôi sao hay cancel có thể được thay đổi.
  • Hủy đánh giá: người dùng có thể hủy đánh giá cho bất kỳ bộ phim bất cứ lúc nào.

Kiến thức cần có

  • Ruby on Rails
  • Cơ bản về HTML/CSS3
  • Cơ bản về CSS framework

Công cụ

  • Ruby (2.1.0)
  • Rails (4.1.1)
  • Foundation 5
  • Gem Ratyrate
  • Gem Devise

Ratyrate gem

Ratyrate là một gem có các chức năng tốt nhất của Raty plugin jQuery. Nó cũng thêm một số chức năng theo phong cách IMDB. Ratyrate có một số chức năng tuyệt vời, dưới đây là hướng dẫn step by step để sử dụng Ratyrate.

Bước 1: Cài đặt Ratyrate

Thêm vào Gemfile:

gem "ratyrate"
$ bundle install

Bạn có thể muốn sử dụng các chức năng của phiên bản trước đó bởi vì bài viết sử dụng phiên bản mới nhất của Ratyrate:

gem 'ratyrate', :github => 'wazery/ratyrate', :branch => 'development'

Bước 2: Chuẩn bị ứng dụng demo

Chúng ta sẽ sử dụng ứng dụng moviestore có sẵn:

$ git clone 'git@github.com:wazery/moviestore.git'
$ cd moviestore

Bây giờ bạn cần sao chép các tệp cần thiết để sử dụng trong ứng dụng (jQuery Raty file plugin, star icons, các tập tin JavaScript) đến đúng vị trí của chúng trong ứng dụng của bạn. Mở terminal và chạy dòng lệnh:

$ rails g ratyrate User

Như ta thấy, lệnh này có một đối số duy nhất là tên model người dùng trong Devise của bạn. Điều này là cần thiết để ràng buộc người dùng và dữ liệu.

Tập tin đầu ra:

create  app/assets/javascripts/jquery.raty.js
create  app/assets/images/star-on.png
create  app/assets/images/star-off.png
create  app/assets/images/star-half.png
identical app/assets/images/mid-star.png
identical app/assets/images/big-star.png
create  app/assets/images/cancel-on.png
create  app/assets/images/cancel-off.png
create  app/assets/javascripts/ratyrate.js.erb
create  app/controllers/rater_controller.rb
create  app/models/rate.rb
create  app/models/rating_cache.rb
create  app/models/average_cache.rb
identical app/models/overall_average.rb
route  post '/rate' => 'rater#create', :as => 'rate'
create  db/migrate/20140814135421_create_rating_caches.rb
identical db/migrate/20140706144643_create_rates.rb
create  db/migrate/20140814135422_create_average_caches.rb
create  db/migrate/20140814135423_create_overall_averages.rb

Chạy migrate để tạo các bảng cần thiết:

$ rake db:migrate

Ví dụ: Bạn có model User trong devise. Khởi tạo devise và ratyrate sẽ như sau:

$ rails g devise:install
$ rails g devise user
$ rails g ratyrate user # => user is the model generated by devise

Khởi tạo này sẽ tạo ra Rate và RatingCache liên kết tới model User. Tuy nhiên bạn không cần phải thực hiện điều này vì trong app moviestore đã thực hiện điều này.

Bước 3: Thêm các thành phần liên quan có ratyrate

Để thêm các tiêu chí đánh giá cho một bộ phim, thêm dòng lệnh sau trong model Movie:

ratyrate_rateable 'visual_effects', 'original_score', 'director', 'custome_design'

Ở trên đã thêm 4 tiêu chí có thể đánh giá một bộ phim.

Bạn cũng cần xác định model nào sẽ thực hiện đánh giá, như ví dụ sẽ là model User, do đó thêm dòng sau vào model này: ratyrate_rater

Bước 4: Sử dụng Ratyrate Helper trong Views

Mở view "show" của movie (app/views/movies/show.html.erb)

<div class="row">
  <div class="small-2 large-2 columns">
    <%= imdb_style_rating_for @movie, current_user%>
  </div>
  <br>
  <div class="small-2 large-4 columns">
    <% if current_user %>
      Visual Effects: <%= rating_for @movie, "visual_effects" %>
      <br>
      Original Score: <%= rating_for @movie, "original_score" %>
      <br>
      Director: <%= rating_for @movie, "original_score" %>
      <br>
      Custome Design: <%= rating_for @movie, "custome_design" %>
    <% end %>
  </div>
</div>

Ratyrate Helper cung cấp rating_for cho mỗi phim được hiển thị.

Bước 5: Thêm tùy chọn rating_for

Giao diện hiện tại đang như sau:

1.png

Như bạn thấy, người dùng có thể hủy đánh giá của mình. Chức năng này có thể bị vô hiệu hóa, chúng ta sẽ tìm hiểu chức năng này sau. Số lượng ngôi sao có thể được thay đổi bằng cách đơn giản sau:

Visual Effects: <%= rating_for @movie, "visual_effects", stars: 10 %>

2.png

Vô hiệu hóa/Sử dụng Đánh giá

Theo mặc định, sau khi người dùng đánh giá phim thì chức năng đánh giá bị vô hiệu hóa. Tuy nhiên, có thể tùy chọn cho phép người dùng thay đổi đánh giá bằng cách đặt false thuộc tính disable_after_rate (mặc định là true):

Visual Effects: <%= rating_for @movie, "visual_effects", disable_after_rate: false %>

Trong một số xếp hạng, có chức năng đánh giá 1 nửa sao. Đây là hành vi mặc định, tuy nhiên ta có thể vô hiệu hóa sao nửa bằng cách sử dụng half_show:

Visual Effects: <%= rating_for @movie, "visual_effects", half_show: false %>

Ngược lại, để đánh giá chính xác hơn với sao nửa, mà bị tắt theo mặc định. Ta có thể kích hoạt lại nó bằng tùy chọn:

Visual Effects: <%= rating_for @movie, "visual_effects", enable_half: true %>

3.png

Tùy biến các biểu tượng

Một trong những lựa chọn hữu ích nhất trong helper này là tùy chỉnh các biếu tượng. Các biểu tượng được cung cấp:

  • star_on
  • star_off
  • star_half
  • cancel_on
  • cancel_off

Có thể thay đổi biểu tượng đánh giá mặc định bằng cách thay đổi đường dẫn:

Visual Effects: <%= rating_for @movie, "visual_effects", path: 'star_icons' %>

4.png

Thay đổi vị trí nút Cancel

Các nút Cancel được hiển thị bên trái, theo mặc định. Bạn có thể thay đổi điều đó để bên phải nếu muốn:

Visual Effects: <%= rating_for @movie, "visual_effects", cancel_place: 'right' %>

5.png

Thêm hint ở nút Cancel

Visual Effects: <%= rating_for @movie, "visual_effects", cancel_hint: 'Cancel this vote!' %>

6.png

Khoảng cách giữa các sao

Có thể tạo khoảng cách giữa các ngôi sao dễ dàng bằng cách:

Visual Effects: <%= rating_for @movie, "visual_effects", space: true %>

7.png

Tính điểm trung bình

Là một lựa chọn mới, có thể thêm vào ứng dụng phong cách tính điểm trung bình của IMDB. Có chút khó khăn, bạn cần sử dụng 2 tùy chọn (disable_after_rate và imdb_avg):

Original Score: <%= rating_for @movie, "original_score", disable_after_rate: true, imdb_avg: true %>

Khi đó, các ngôi sao sẽ thay đổi để hiển thị điểm đánh giá trung bình theo phong cách IMDB sau khi refresh trang. 8.png

Hiển thị điểm gợi ý

Bạn có thể hiển thị gợi ý cho điểm (bad, poor, regular, gorgeous) hoặc hủy bỏ gợi ý trong một thẻ div tùy chọn thay vì hiển thị trong tooltips:

Original Score: <%= rating_for @movie, "original_score", target: '#hintDiv' %>
<div id="hintDiv"></div>

Như bạn thấy, "hintDiv" được chọn theo ID của nó. Như vậy nó không chỉ giới hạn hiển thị bằng thẻ div mà có thể ở các thẻ khác như text field, text area, select box. 9.png

Thêm văn bản vào gợi ý

Original Score: <%= rating_for @movie, "original_score", target: '#hintDiv', targetText: 'Some text goes here!' %>

10.png

Thay đổi target type

Mặc định là "hint":

Original Score: <%= rating_for @movie, "original_score", target: "#hintDiv", targetType: "hint" %>

Hoặc tùy chọn "score":

Original Score: <%= rating_for @movie, "original_score", target: "#hintDiv", targetType: "score" %>

11.png

Thay đổi định dạng target

Bạn có thể đổi điểm "5" thành đánh giá "Tốt", rất đơn giản:

Original Score: <%= rating_for @movie, "original_score", target: "#hintDiv", targetFormat: "Score: {score}" %>

12.png

Original Score: <%= rating_for @movie, "original_score", target: "#hintDiv", targetFormat: "Rating: {hint}" %>

Đánh giá cho User Helper

Nó dùng để xem những đánh giá của người dùng hiện tại. Nếu người dùng không có đánh giá nào, sẽ hiển thị 1 ngôi sao:

Visual Effects: <%= rating_for_user @movie, current_user, "visual_effects" %>

13.png

Theo phong cách IMDB, sử dụng:

<%= imdb_style_rating_for @movie, current_user %>

14.png

Kết luận

Trong bài viết này, gem Ratyrate được sử dụng để thêm chức năng đánh giá phim trong MovieStore. Chúng ta tìm hiểu chi tiết cách sử dụng gem, những helper và tùy chọn có sẵn. Hy vọng giúp ích được cho bạn.

Nguồn: https://www.sitepoint.com/ratyrate-add-rating-rails-app/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí