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

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

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

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

Q&A

解決済

2回答

380閲覧

railsを利用してWEBサービスを作っています。モデルにメソッドを書いて、そのメソッドをviewに呼び出すところで詰まっています。

mnhy613

総合スコア21

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/24 05:42

現在、口コミサイトを制作しています。

商品を登録し、その商品に点数評価とコメントを残していく機能です

Aという商品に3つ評価がつき、それぞれの点数が3点、4点、5点だったとします。

全ての評価を足して、その評価の数だけ割った数値を表示させたいです。

この場合、3+4+5=12  12/3=4です

Itemモデルに

def self.total_taste item = Item.find(params[:id]) comments = item.comment @sum = 0 comments.each do |a| @sum += (a.value.round(1))/comments.count.to_i end return @sum end

item.show.erbに

<% Item.total_taste %>

このように書いたところ

undefined local variable or method `params'

このようなエラーが出ます

URLにparamsのidが表示されるのですが、modelのメソッドはそこを読んでくれないのでしょうか?

解決策を教えて欲しいです

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

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

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

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

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

guest

回答2

0

def self.total_taste
ですと、Item全体を相手にしてしまいます。

item.show.erb ということは @item とかを表示するようになっていると思うのでこういう場合は
<%= @item.total_taste %> とし(=忘れないでね)
def total_taste return unless comments.size > 0 (comments.inject(0.0){|s,comment| s+comment.value }/comments.size).round(1) end
などと。
ただし、comments を使うには has_many :commentsが定義されてること。

投稿2020/04/24 07:08

編集2020/04/24 07:09
winterboum

総合スコア23401

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

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

mnhy613

2020/04/24 11:48

ご回答ありがとうございます。 def total_taste return unless comments.size > 0 (comments.inject(0.0){|s,comment| s+comment.value }/comments.size).round(1) end このコードはモデルに書くのですか? それともviewに書くのでしょうか?
winterboum

2020/04/24 12:06

viewでは普通methodは書きません。 書けないこともないなぁ、と今気が付きました。helperに書くのとどう違うだろう。。。 まぁ、読みにくいviewになることは間違いなさそう。 modelに書いてください
guest

0

ベストアンサー

paramsを利用できるのはコントローラのアクション内だけです。
ここでは単にidを引数で受け取れる事が出来れば良いので、メソッドに引数を追加します。
また、find(id)ではレコードがない時に例外が発生してしまうので、
find_by()を使ってレコードが見つからない場合は例外ではなくnilを受け取れるようにしたほうが良いと思います。

ruby

1def self.total_taste(id) 2 item = Item.find_by(id: id) 3 4 # レコードが見つからない場合は規定値を返す 5 unless item 6 return 0 7 end 8 9 comments = item.comments 10 sum = 0 11 comments.each do |a| 12 sum += (a.value.round(1))/comments.count.to_i 13 end 14 15 return sum 16end

投稿2020/04/24 05:47

mingos

総合スコア4032

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

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

mnhy613

2020/04/25 00:48

引数が0とエラーが出てしまいます。 wrong number of arguments (given 0, expected 1) def self.total_taste(id)
mingos

2020/04/25 08:04

引数を追加したので、ビューで使用する時も引数を渡す必要があります。 <%= Item.total_tast(1) %>のような感じです。 idはparamsで受け取れるから、このように書く必要があります。 <%= Item.total_tast(params[:id]) %>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問