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

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

ただいまの
回答率

88.91%

別モデルのview上にMicropostを表示させたい(Railsチュートリアル)

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,015

yamady

score 177

閲覧いただきありがとうございます。
チュートリアルを見ながら、レストランの口コミサイト(食べログのような)作成に挑戦しています。

チュートリアルで「Micropost」とされているところを「Review」に変更して取り組んでいるのですが、紐付けがうまくいっていないのか苦戦しています。とりわけ問題となっているのが、レストランそれぞれに地域カテゴリをつけて表示させているので、初心者の私は完全にルーティングで混乱状態です(涙)

 実現したいこと

・レストランページ(category/tokyo/restaurants/1)上に、Userモデルに紐付いた口コミ(review)を表示させたい

 エラー内容

NoMethodError in Spaces#review

<%if @feed_items.any? %>
  <%= render @feed_items %>
  <%= will_paginate @feed_items %>
<% end %>


Trace of template inclusion: app/views/categories/tokyo/restaurants/1.html.erb

 関連がありそうなファイル

■ ビュー

app/views/restaurants/1.html.erb

・・・
<section>
   <%= render 'shared/feed' %>
</section>
・・・


■ モデル

app/models/category.rb

class Category < ApplicationRecord
  has_many :restaurants
end

app/models/review.rb

class Review < ApplicationRecord
  belongs_to :user
  belongs_to :restaurant
・・・
end

app/model/restaurant.rb

class Restarurant < ApplicationRecord
  has_many :reviews
  belongs_to :category

・・・

  def feed
    Review.where("user_id = ?", id)
  end
end

app/model/user.rb

  has_many :reviews, dependent: :destroy
・・・

■ コントローラー

app/controllers/categories_controller.rb

class CategoriesController < ApplicationController
  def show
    @category = Category.find_by(category_name: params[:category_name])
  end
end

app/controllers/reviews_controller.rb

class ReviewsController < ApplicationController
  before_action :logged_in_user
  before_action :correct_user, only: :destroy

  def create
    @review = current_user.reviews.build(review_params)
    if @review.save
      flash[:success] = "口コミが投稿されました!"
      redirect_to root_path
    else
      @feed_items = []
      redirect_to root_path
    end
  end

  def new
    @review = current_user.reviews.build if logged_in?
  end

  def destroy
    @review.destroy
    flash[:success] = "口コミが削除されました"
    redirect_to request.referrer || root_url
  end

  def edit
  end

  def update
  end

  private

  def review_params
    params.require(:review).permit(:content)
  end

  def correct_user
    @review = current_user.reviews.find_by(id: params[:id])
    redirect_to root_url if @review.nil?
  end
end

app/controllers/restaurants_controller.rb

class RestaurantsController < ApplicationController
  def show
    if logged_in?
      @review = current_user.reviews.build
      # @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end
・・・

app/controllers/users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @reviews = @user.reviews.paginate(page: params[:page])
  end
・・・


■ ルーティング

routes.rb

Rails.application.routes.draw do
  get 'areas/show'
・・・
  resources :areas, param: :category_name do
    resources :restaurants, only: [:show]
  end
・・・
  resources :reviews

長々とまた、複雑なケースですみません。。
どうぞよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kenchankunsan

    2017/05/07 19:44

    NoMethodError in Spaces#review このメッセージはSpacesクラスにreviewというインスタンスメソッドがないということを言っています。質問の中にはSpacesクラスがないのですが、どこかにありますか?また、 Trace of template inclusion: app/views/categories/tokyo/restaurants/1.html.erb というメッセージからは、そのエラーがこのファイルを表示しているときに起きていることを言っていますので、このファイルをすべて見せていただけると原因がわかるかもしれません。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る