0

Ruby on Rails と Raty.js を使用して、ピンの評価システムを作成しました。各ピンの個々のショー ページで平均評価を確認できます。それをインデックスファイルに組み込みたいと思います。現在、インデックス内のすべてのピンに表示されている評価は、最初のピンの平均評価です。

注: インデックス ファイルに 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
4

1 に答える 1

1

実際には、最後のピンの平均評価を示しています。

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

ここでの各ループは、1 つの変数を新しい値に設定するだけです。

したがって、ピンに平均評価属性を追加し、誰かが評価するたびに更新します。

または、変数を配列にします。

@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 %>

または、設定したピンの属性を許可できます

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 %>
于 2015-02-18T17:18:23.960 に答える