我有会场记录,其中每个都有评论,每个评论可以评为1到5,我正在使用以下方式显示平均评论评分:
<%= @venue.reviews.average(:rating) %>
我想将评分表示为星图而不是数字。
我认为这个设置可以容纳明星:
<div class="star_rating_container">
<div class="star_rating" style="width: <%= @venue.reviews.average(:rating)*20 %>px;">
</div>
</div>
用这个css:
.star_rating_container {
width: 100px;
height: 20px;
background-image: url(/images/dim_star.png);
}
.star_rating {
height: 20px;
background-image: url(/images/lit_star.png);
}
然而问题是我得到一个“当你没想到它时你有一个nil对象!你可能已经预料到一个Array的实例。当我试图查看一个时,在评估nil。*时出错了。”没有评论的场地。
我是编程的新手,我正在努力解决这个问题。
感谢任何帮助,非常感谢!
答案 0 :(得分:2)
你想这样做:
<%= (@venue.reviews.average(:rating) || 0 ) *20 %>
这样,如果你没有评级,它将默认为0,因此不会抛出错误,但也提供将宽度设置为0的所需结果。如果你有评论,它将短路到平均评级那个场地。
这里的问题是.average()在没有任何评论时返回nil,所以它正在做(nil * 20)......这显然不起作用。
答案 1 :(得分:1)
你可能会变得棘手,但最直接的解决方案就是:
<% unless @venue.reviews.empty? %>
<div class="star_rating_container">
<div class="star_rating" style="width: <%= @venue.reviews.average(:rating)*20 %>px;">
</div>
</div>
<% end %>
答案 2 :(得分:0)
将其更改为<%= @venue.reviews.average(:rating)*20 rescue 0 %>
。这样你就有了0宽度样式