質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

895閲覧

レビュー評価の平均値を実装する方法を知りたい

begin1990

総合スコア31

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/02/26 13:19

編集2018/02/26 16:08

現在、レビュー評価の平均値をhokkaido/showに表示しようと試みています。

試したこと
hokkaidos_controller.rbに、

def averages(hokkaido) @average_hokkaido_reviews = Review.group(:hokkaido_id).average(:evaluation) end

を記入

hokkaidos.show.html.erbに

<div>   <%= @average_hokkaido_reviews %> </div>

を記入

コード
hokkaidos_controller.rb

class HokkaidosController < ApplicationController def index @hokkaidos = Hokkaido.all.page(params[:page]) end def show @hokkaido = Hokkaido.find(params[:id]) @hokkaido_reviews = @hokkaido.hokkaido_reviews.order('created_at DESC').page(params[:page]) counts(@hokkaido) end def counts(hokkaido) @count_hokkaido_reviews = hokkaido.hokkaido_reviews.count end def averages(hokkaido) @average_hokkaido_reviews = Review.group(:hokkaido_id).average(:evaluation) end end

hokkaidos.show.html.erb

<div class="area hokkaido"> <h1><%= @hokkaido.title %></h1> <ul class="media-list"> <div class="row"> <aside class="col-xs-6"> <div class="panel panel-default"> <div class="panel-heading"> <li class="media"> <img border="0" src="/images/<%= @hokkaido.image_url %>" class="sample" width = "480" height = "320"> <h2>商品情報</h2> <p><%= @hokkaido.content %></p> <div> <%= @average_hokkaido_reviews %> </div> <%= link_to 'レビュー一覧', hokkaido_hokkaido_reviews_path(@hokkaido, @hokkaido_review), class: 'btn btn-primary' %> <span class="badge">レビュー:<%= @count_hokkaido_reviews %>件</span> </li> </div> </div> </aside> </div> </ul> </div>

routes.rb

Rails.application.routes.draw do root to: 'toppages#index' get 'login', to: 'sessions#new' post 'login', to: 'sessions#create' delete 'logout', to: 'sessions#destroy' get 'signup', to: 'users#new' resources :users resources :hokkaidos, only: [:index, :show, :count] , shallow: true do resources :hokkaido_reviews, only: [:index, :new, :create, :destroy] end resources :touhokus, only: [:index, :show] , shallow: true do resources :touhoku_reviews, only: [:index, :new, :create, :destroy] end resources :kantous, only: [:index, :show], shallow: true do resources :kantou_reviews, only: [:index, :new, :create, :destroy] end resources :koushinetsus, only: [:index, :show], shallow: true do resources :koushinetsu_reviews, only: [:index, :new, :create, :destroy] end end

悩み事
以上の事を試みても、平均値が表示されませんでした。
そのため、平均値を実装する方法を検索しても、回答が見つかりませんでした。

検索しても見つからないため、どなたかわかる方がいらっしゃいましたら、アドバイスをお願いできませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scivola

2018/02/26 13:34

routes.rb と HokkaidosController の show アクションの定義を見せてください。「平均値が表示されませんでした」はその div 要素の中が空だったという意味でしょうか。
begin1990

2018/02/26 16:08

routes.rb と HokkaidosController の show アクションの定義を質問文に追加しました。また、「平均値が表示されませんでした」はその div 要素の中が空だったという意味です。
guest

回答1

0

ベストアンサー

show アクションで averages メソッドを呼んでいないからですね。

投稿2018/02/26 22:17

scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

begin1990

2018/02/27 11:27

averagesメソッドの呼び出し方が分かりませんが、 @hokkaido_reviews = @hokkaido.hokkaido_reviews.order('created_at DESC').page(params[:page]) averages(@hokkaido) この様に呼ぶと、NameErrorが発生します。 https://gyazo.com/62eeeb677298d19235559e4fdc7e8eb0 すでに、showアクションでcountsメソッドを呼び出しており、 @hokkaido_reviews = @hokkaido.hokkaido_reviews.order('created_at DESC').page(params[:page]) counts(@hokkaido) と同じようにやろうと試みましたが、上手く行きませんでした。 show アクションで averages メソッドを呼ぶ方法について、何か参考になる方法はありませんか? 調べてみましたが見つかりませんでした。
scivola

2018/02/27 13:01

エラーメッセージをよく見てみてください。 averages メソッドの実行中に 「HokkaidosController::Review って定数は初期化されてないけど」 と言っています。 ちょっと意訳すると,「Review とかいう定数は知らない」ということです。 averages がうまく呼べなかったのではなく,Review の定義が見当たらないのです。 コードを見る限り Review はモデルクラスのような感じですが,どこかで定義していますか。
begin1990

2018/02/28 11:18 編集

これは、本来はHokkaidoReviewです。 スペルミスでした。 それと、現在、Hokkaidoの商品は3つありまして、それぞれのshow.html.erb(パスはhokkaidos/hokkaido_id)を確認したところ、すべての商品ページに {1=>0.5e1, 3=>0.45e1} が表示されています。 つまり、レビューがない商品のページにも表示されている状況です。 これを、商品ごとに表示させる(例:hokkaidos/1のページには、hokkaidos/1のみのレビューの平均を表示させる)には、どの部分を修正する必要がありますか? コードは質問文のところに書いてある通りです。
scivola

2018/02/28 23:53

話を先に進める前に,スペルミスを訂正した結果,どうなったのかを教えてください。
scivola

2018/03/01 15:33 編集

分かりました。NameError は解消したけれど結果が期待と違う,という話だったのですね。 {1=>0.5e1, 3=>0.45e1} というのは,hokkaido_id が 1 のものの平均が 0.5e1(つまり 5),3 のものが 0.45e1(つまり 4.5)ということですね。 0.5e1 とかいうのはいわゆる指数表記です。値が BigDecimal なので文字列化するとこういう表現になるのですね。 さて,このように,Hokkaido のすべてのレコードについての HokkaidoReview の平均値をまとめたものになってしまったのは, averages メソッドが HokkaidoReview.group(:hokkaido_id).average(:evaluation) のようになっているからです。group が使ってありますね。 メソッド名が averages と複数形になっているところから見ても,このメソッドの役割は本来はそのようなものだったのでしょう。 なので,解決策は二つ。 一つは,ビューで @average_hokkaido_reviews ではなく @average_hokkaido_reviews[@hokkaido.id] とすること。 もう一つは,show メソッドで @review_average = @hokkaido.hokkaido_reviews.average みたいにすることですね。モデル間のアソシエーションの定義が分からないのでこのコードでよいかわかりませんが。
begin1990

2018/03/02 15:50

ご回答ありがとうございます。 これで解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問