1

私はこのチュートリアルに従おうとしていますが、私は立ち往生しています: 5 つ星評価機能を Rails 4 モデルに追加します。

javascript と ajax の初心者なので、javascript で ajax がどのように機能するかを数時間学習しました。問題はメソッドがどこにあるかに関係していると思います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

  • 最後に、ratings.size は create 後に更新されません。これはゼロ除算を説明している可能性があります。この質問の選択された回答とコメントで詳細をお読みください。したがって、count (データベースをチェックするため、保存された評価のみがカウントされます) または length (つまり、作成された (保存されていない) オブジェクトもカウントされる user/review.ratings.length を使用することをお勧めします)。

それが役立つことを願っています。

于 2014-04-17T06:27:07.503 に答える