我有每个有评论的场所记录,每个评论可以被评为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时发生错误。*"当我试图查看一个没有评论的场地时出现错误。
我对编程非常陌生,正在努力解决这个问题。
谢谢你的帮助,非常感谢!
你想做的是:
<%= (@venue.reviews.average(:rating) || 0 ) *20 %>
这样,如果您没有评级,它将默认为0,因此不会抛出错误,而且还提供将宽度设置为0的预期结果。如果你有评论,它会缩短到该场所的平均评分。
这里的问题是。average()在没有任何评论时返回nil,所以它正在做(nil * 20)…这显然行不通
你可能会很棘手,但最直接的解决方案是:
<% unless @venue.reviews.empty? %>
<div class="star_rating_container">
<div class="star_rating" style="width: <%= @venue.reviews.average(:rating)*20 %>px;">
</div>
</div>
<% end %>
修改为<%= @venue.reviews.average(:rating)*20 rescue 0 %>
。这样你就有了宽度为0的样式