1

我正在尝试按照本教程进行操作,但遇到了困难:向 Rails 4 模型添加 5 星评级功能

我是 javascript 和 ajax 的初学者,所以我花了几个小时学习 ajax 如何与 javascript 一起工作。我相信问题与average_rating方法在哪里(导轨问题?)有关。

def average_rating
  ratings.sum(:score) / ratings.size
end 

目前我已经完全按照教程的说明进行操作,同时用评论替换评论。在教程中,它说要在评论模型中定义 average_rating (我的是在评论模型中),我不确定我为什么要这样做。

我还添加了这个(不确定它是属于当前控制器还是属于评级控制器):

#this is the controller used for the view which displays the stars
def page
  @rating = Rating.where(review_id: @review.id, user_id: @current_user.id).first
  unless @rating
    @rating = Rating.create(review_id: @review.id, user_id: @current_user.id, score: 0)
  end
end

当我尝试在此处加载页面时出现错误:ZeroDivisionError下面说divided by 0并突出显示了这一行score: <%= @review.average_rating %>,

更新当我从具有average_rating 的视图中删除此脚本时,my_rating 会显示星星。所以有些东西弄乱了平均部分:

<script> #did not delete this line
  $('#star').raty({
    readOnly: true,
    score: <%= @review.average_rating %>,
    path: '/assets'
  });

删除部分^^^

4

1 回答 1

0

基本上,我很想获得更多信息,但这里有一些可能会有所帮助的提示:

  • 确保关系正常:确保你有has_many :ratings用户/评论和'belongs_to :user/:review'的评级。其他方向-您是否以控制器方法获得评级?如果是这样,请考虑将其更改为@ratings。
  • 使用 first_or_XXXX - 这是保存条件实例化的一个很好的 rails 选项。有first_or_create可以完全按照您的操作:

Rating.where(review_id: @review.id, user_id: @current_user.id).first_or_create do |rating| rating.score = 0 end

  • 最后, rating.size在 create 之后不会更新,这可能解释了零分区。在这个问题的选择答案和评论中阅读更多内容。因此,建议使用 count (将检查数据库,因此只计算保存的评级)或长度(即 user/review.ratings.length 也将计算已构建(未保存)的对象。

希望有帮助。

于 2014-04-17T06:27:07.503 回答