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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

208閲覧

トップページにて親に紐づいた子のカラムのcommentを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/03/01 00:56

前提・実現したいこと

現在お店の投稿サイトを作成しておりまして、トップページにてそのお店ごとに紐づいてるコメントを数件ずつ表示させたいと考えています。

https://gyazo.com/166ca3101ac218c84487c0aab34ffbc8
こういうイメージです。

発生している問題・エラーメッセージ

undefined method `each' for nil:NilClass

該当のソースコード

review controller def create @review = Review.new(review_params) if @review.save redirect_to restaurant_path(@review.restaurant), notice: "レビューしました!" else flash[:alert] = "両方入力してください" redirect_back(fallback_location: root_path) end end def show @review = Review.find(params[:id]) @pimages = @restaurant.iamges @reviews = @restaurant.reviews.order(created_at: :desc) end
top controller def index @review = Review.find_by(id: params[:id]) @restaurant = Restaurant.all.order("id DESC").first(6) @image = Image.all.order("id DESC") end
index.haml - @restaurant.zip(@image) do |o,i| .......省略 - @reviews.each(@comment) do |i| = i.comment #ここを表示させたい

試したこと

ここに問題に対して試したことを記載してください。

昨日から色々試しておりますが、解決に至らなかったので質問させていただきます。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

TopControllerのIndexアクションで作った変数がindex.hamlで利用可能です。

@reviews.each(@comment) do |i|

で書かれている @reviewsはTopControllerのIndexアクションで定義されていません。
ReviewControllerのShowアクションに書かれているような

@reviews = @restaurant.reviews.order(created_at: :desc)

などで@reviewsを定義してあげるとうまく行くかもしれません。

また

@reviews.each do |i|

って書き方でいいかと。

追記

コメント欄で質問者様の望む適切な仕様がはっきりしたので、回答を追記
レストランとレビューがhas_many <=>belogns_toの関係になっていることを前提とします。
@reviews = @restaurant.reviewsを削除
View側で

- @restaurant.each do |rest| - rest.reviews.each do |review| = review.comment

投稿2020/03/01 03:07

編集2020/03/01 04:12
hatsu

総合スコア1809

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

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

退会済みユーザー

退会済みユーザー

2020/03/01 03:23

ありがとうございます。 ``` def index @review = Review.find_by(id: params[:id]) @restaurant = Restaurant.all.order("id DESC").first(6) @image = Image.all.order("id DESC") @reviews = @restaurant.reviews end ``` こういった記述で、hamlも@reviews.each do |i|こう直しましたが、reviewがundefinedになってしまいます。 コントローラーは跨いでインスタンスの定義はできると思っておりましたが違うのでしょうか、、? レストランの詳細ページでは上の記述で表示できますが、別コントローラーのページだと途端に開かなくなってしまいます。
退会済みユーザー

退会済みユーザー

2020/03/01 03:34

-if @reviews.present? - @reviews.each do |r| = r.comment #ここを表示させたい eachがnilなのでなんとかコントローラーで定義しようとしているのですが、うまくいきません。 どうにか定義出来ればと考えています、、、
hatsu

2020/03/01 03:44

reviewでなく、@reviewが undefinedになったという理解でよろしいですか? Indexアクションで@review = Review.find_by(id: params[:id])を使う必要もないと思うので、こちらは削除しても問題ないかと思います。
退会済みユーザー

退会済みユーザー

2020/03/01 03:51

ありがとうございます。 コントローラー上で undefined method `reviews' for #<Array:0x00007fbd896ef3e0> Did you mean? reverse なので、@reviewではなくreviewがundefinedになっております。 @review = Review.find_by(id: params[:id]) こちらは削除させていただきました。
退会済みユーザー

退会済みユーザー

2020/03/01 03:51

reviewsです、大変失礼しました。
hatsu

2020/03/01 03:59

なるほどです。@restaurant.reviewsのreviewsがないと言われているのですね。 解決策を2つ示します。適切な仕様はわからないので、お選びください。 解決策1:全てのレビューの一覧を表示させる 解決策2:「レストランに紐づいた」レビューの一覧を表示させる 解決策1 @reviews = Review.all.order("id DESC") とすれば大丈夫です。 解決策2 レストランとレビューがhas_many <=>belogns_toの関係になっていることを前提とします。 @reviews = @restaurant.reviewsを削除 View側で - @restaurant.each do |rest| - rest.reviews.each do |review| = review.comment とします。
退会済みユーザー

退会済みユーザー

2020/03/01 04:09

ありがとうございます! やっと表示することができました! eachを二重にするやり方は初めて知りました。 現状は一個のレストランに全部のコメントが出てしまいますが、調整をやっていきます。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問