Rails助手可显示星级评分

时间:2019-12-25 10:58:23

标签: ruby-on-rails ruby

使用Rails 6.这是我写的只是为了显示星星数的部分。显然,我对自己的代码感到厌恶。您将如何重构?

# application_helper.rb
module ApplicationHelper
  def show_star_rating(rating)
    zero_star_icon_name = "star"
    full_star_icon_name = "star_fill"
    half_star_icon_name = "star_lefthalf_fill"
    total_stars = []
    round_by_half = (rating * 2).round / 2.0
    (round_by_half.to_i).times { total_stars << full_star_icon_name }

    if round_by_half - round_by_half.to_i == 0.5
      total_stars << half_star_icon_name
    end

    if total_stars.size != 5
      (5 - total_stars.size).times { total_stars << zero_star_icon_name }
    end

    total_stars
  end
end

# show.html.erb
<% show_star_rating(agent_review.rating).each do |star| %>
  <i class="f7-icons"><%= star %></i>
<% end %>

2 个答案:

答案 0 :(得分:2)

您可以使用Array.new,传入要显示的最大星星数,并将所有星星默认为空。然后,您可以fill输入所需的满星数量。然后,最后,由于Numeric的{​​{3}}返回了01所需的半星数量,您又通过了一次,{{1} }中所需的半星数量:

fill

答案 1 :(得分:1)

我实现show_star_rating的方式:

def show_star_rating(rating)
  zero_star_icon_name = "star"
  full_star_icon_name = "star_fill"
  half_star_icon_name = "star_lefthalf_fill"
  rating_round_point5 = (rating * 2).round / 2.0

  (1..5).map do |i|
    next(full_star_icon_name) if i <= rating_round_point5
    next(half_star_icon_name) if rating_round_point5 + 0.5 == i
    zero_star_icon_name
  end
end