繁体   English   中英

星级评分rails 4 jquery ajax javascript raty

[英]star rating rails 4 jquery ajax javascript raty

我试图按照本教程操作,但陷入了困境: 在Rails 4模型中添加了5星评级功能

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

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'
  });

删除的部分^^^

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

  • 确保该关系有效 :确保用户/评论具有has_many :ratingshas_many :ratings具有'belongs_to:user /:review'。 其他方向-您是否通过控制器方法获得额定值? 如果是这样,请考虑将其更改为@ratings。
  • 使用first_or_XXXX-这是保存条件实例化的绝佳选择。 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(将在db上检查,因此仅对保存的评级进行计数)或length(即user / review.ratings.length)也将对已构建(未保存)的对象进行计数。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM