在 Rails 和 Raty.js 上显示索引 Ruby 中的 pin/post 平均评分
Show pin/post average rating in index Ruby on Rails and Raty.js
我已经在 Rails 和 Raty.js 上使用 Ruby 为我的图钉创建评级系统。您可以在每个图钉的各个显示页面中查看平均评分。我想将其合并到我的索引文件中。目前,索引中所有图钉显示的评级是第一个图钉的平均评级。
注意:我使用 Haml 作为索引文件,但如果您能提供基本的答案 html,那就没问题了。
index.html.haml:
.panel-footer
.btn-group.pull-left
%div{class: "srating", dscore: @avg_review }
:javascript
$('.srating').raty({
path: '/assets/',
readOnly: true,
score: function() {
return $(this).attr('dscore');
}
});
pins_controller.rb:
class PinsController < ApplicationController
before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote, :un_upvote]
before_action :authenticate_user!, except: [:index, :show]
def index
@pins = Pin.all.order("created_at DESC").paginate(page: params[:page], per_page: 7)
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_review = 0
else
@avg_review = @stars_reviews.average(:rating).round(2)
end
end
end
它实际上显示的是最后一个图钉的平均评分。
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_review = 0
else
@avg_review = @stars_reviews.average(:rating).round(2)
end
end
这里的每个循环只是将一个变量设置为新值。
因此,要么在 pin 上添加一个平均评分属性,并在每次有人对其评分时更新它。
或者将变量设为数组:
@avg_reviews = []
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_reviews << 0
else
@avg_reviews << @stars_reviews.average(:rating).round(2)
end
end
然后在引脚上循环输出
<% @pins.each_with_index do |pin, i| %>
%div{class: "srating", dscore: @avg_reviews[i] }
<% end %>
或者您可以在您设置的 pin 上允许一个属性
class Pin
attr_accessor :avg_review
end
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
singlepin.avg_review = 0
else
singlepin.avg_review = @stars_reviews.average(:rating).round(2)
end
end
然后在视图中访问它
<% @pins.each do |pin| %>
%div{class: "srating", dscore: pin.avg_review }
<% end %>
我已经在 Rails 和 Raty.js 上使用 Ruby 为我的图钉创建评级系统。您可以在每个图钉的各个显示页面中查看平均评分。我想将其合并到我的索引文件中。目前,索引中所有图钉显示的评级是第一个图钉的平均评级。
注意:我使用 Haml 作为索引文件,但如果您能提供基本的答案 html,那就没问题了。
index.html.haml:
.panel-footer
.btn-group.pull-left
%div{class: "srating", dscore: @avg_review }
:javascript
$('.srating').raty({
path: '/assets/',
readOnly: true,
score: function() {
return $(this).attr('dscore');
}
});
pins_controller.rb:
class PinsController < ApplicationController
before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote, :un_upvote]
before_action :authenticate_user!, except: [:index, :show]
def index
@pins = Pin.all.order("created_at DESC").paginate(page: params[:page], per_page: 7)
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_review = 0
else
@avg_review = @stars_reviews.average(:rating).round(2)
end
end
end
它实际上显示的是最后一个图钉的平均评分。
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_review = 0
else
@avg_review = @stars_reviews.average(:rating).round(2)
end
end
这里的每个循环只是将一个变量设置为新值。
因此,要么在 pin 上添加一个平均评分属性,并在每次有人对其评分时更新它。
或者将变量设为数组:
@avg_reviews = []
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
@avg_reviews << 0
else
@avg_reviews << @stars_reviews.average(:rating).round(2)
end
end
然后在引脚上循环输出
<% @pins.each_with_index do |pin, i| %>
%div{class: "srating", dscore: @avg_reviews[i] }
<% end %>
或者您可以在您设置的 pin 上允许一个属性
class Pin
attr_accessor :avg_review
end
for singlepin in @pins
@stars_reviews = StarsReview.where(pin_id: singlepin.id)
if @stars_reviews.blank?
singlepin.avg_review = 0
else
singlepin.avg_review = @stars_reviews.average(:rating).round(2)
end
end
然后在视图中访问它
<% @pins.each do |pin| %>
%div{class: "srating", dscore: pin.avg_review }
<% end %>