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

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

ただいまの
回答率

88.32%

作品にレビューを紐付けして表示させたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 233

sa.k

score 6

前提・実現したいこと

railsでレビューサイトの個人アプリを作っています。
レビューに作品ごとのidを入れたいです。

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

レビューに作品ごとのidを入れたい
作品をpostsテーブルという名前で作成。レビューをreviewsテーブルという名前で作成。
reviewsテーブルにpost_idというカラムを作りました。ここに作品ごとの(post.id)idを入れたいのですが作品ごとのidが入らずカラムに全部0が入ります。

エラーメッセージ

該当のソースコード

ルーティング

Rails.application.routes.draw do
  devise_for :users
  get '/' => 'posts#index'
  get 'posts/new'  => 'posts#new'
  post 'posts/create' => 'posts#create'
  get 'posts/:id' => 'posts#show'
  post 'posts/:id' => 'posts#show'
  post 'reviews/create' => 'reviews#create'
  get 'reviews/new' => 'reviews#new'
  resources :posts, only: :show do
    resources :reviews, only: [:new, :create]
    collection do
      get 'search'
    end
  end
end

reviewsコントローラー

  def new
    @post = Post.find(params[:post_id])
  end
  def create
    @reviews = Review.new(nickname: params[:nickname],rate: params[:rate],review: params[:review],post_id: params[:post_id])
   if @reviews.save!
    redirect_to('/')
   end
  end


postのshow.html.erb(作品を表示しているところ。ここからreviewのnew.html.erbに飛ぶ)

<div class="show_main">
  <h1 class="show_title"><%= @post.name %></h1>
  <div class="content_post" style="background-image: url(<%= @post.image %>);">
  </div>
  <a href="/reviews/new?post_id=<%= @post.id %> "class="review_link">この作品をレビューする</a>
  <% @reviews.each do |review| %>
  <div class="review"><%= review.nickname %></div>
  <div class="review"><%= review.review %></div>
  <%end%>

reviewのnew.html.erb(レビューの投稿画面)

 <%= form_tag('/reviews/create',{multipart: true}) do %>
<input placeholder="ニックネーム" type="string" name="nickname">
<input  type="integer" name="rate">
<textarea name="review" rows="4" cols="40" type="text">ここに感想を記入してください。</textarea>
<%= hidden_field_tag :post_id,value: @post.id %>
<input type="submit" value="SENT">
<%end%>

試したこと

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

補足情報(FW/ツールのバージョンなど)

modelには特に触れていません。
post.rbにhas_many :reviews
review.rbにbelongs_to :post
をかくと送信ができずMySQLにデータが入らないので
ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2020/01/18 01:24

    >レビュー投稿機能を実装中に以下のエラーメッセージが発生しました。
    エラーメッセージがどこにもないです。
    エラーメッセージは表示された内容をそのまま質問にコピペしてください。https://teratail.com/help/question-tips#questionTips3-4-2

    キャンセル

  • Orlofsky

    2020/01/18 01:25

    テーブルの定義情報をCREATE TABLEで、各テーブルのデータもINSERTで何件かあったほうが適切なコメントが付き易いです。

    キャンセル

  • Orlofsky

    2020/01/18 01:25

    コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。

    キャンセル

  • winterboum

    2020/01/18 06:53

    「コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。」
    これかなり重要です。読みにくいcodeだと読んでくれない、回答がつかない。

    キャンセル

回答 2

+1

おかしな点がいくつかありますが、肝心のエラー内容が質問内に書かれていないため、
今どこでつまづいているのかこちらでは把握できません。
記事内に現在起きているエラーを追記し、一つずつ潰していくのがよろしいかと思います。

とりあえず、質問の最初に書かれている

reviewsテーブルにpost_idというカラムを作りました。ここに作品ごとの(post.id)idを入れたいのですができないです。

に関わる部分の回答をしておきます。
レビュー作成の部分、紐付けをモデルで行なっている前提ではありますが...

# posts_controller.rb
def create
  @post = Post.find_by(id: params[:post_id]) # params[:id]ではないはず、未検証。
  # @post.reviews.build とすることで @post に紐づく reviews を作成できます。
  # 後から save するのであれば create ではなく build (newでも可)
  # 変数名がおかしい、中身が単数の場合は単数形の名前を使用すること。
  @review = @post.reviews.build(nickname: params[:nickname],
                                rate: params[:rate],
                                review: params[:review])
  # save ではなく save! とすることで保存に失敗した際にバリデーション結果が出力されるので、原因に気付きやすい
  if @review.save!
    redirect_to('/')
  end
  # 保存に失敗した時の処理がないので追加しておくこと。
end
<%# reviews/new.html.erb %>
<%# おそらくフォームの送信先がおかしいのできちんと待ち受けているところに向けて送信する %>
<%= form_tag('posts/#{@post.id}/reviews',{multipart: true}) do %>


こんな感じでどうでしょうか。
どのURLでどんなリクエストを受け付けているのかは、ターミナル上で

$ rails routes


を実行することで確認できます。
フォームやリンクはそれをめがけて正しいHTTPリクエストを発行するようにしましょう。

viewの箇所は、本当はの以下の方が好ましいですが、よくわからなければ今後の課題としてください。

<%= form_with(model: [@post, Review.new], local: true, multipart: true) do %>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

-1

Review の create の時に post_id を設定する必要がありますが、渡って居ません。Reviewのnewにpost_idが無いので。

下流から行きます
1) reviewのnew.htmlの input に並べて <%= hidden_field_tag :post_id,value: @post.id %> を入れてください。
2)def new に @post = Post.find(params[:post_id]) と定義。
3)Postのshowの<a href="/posts/<%= @post.id %>/reviews/new"class="review_link"> からReviewsControllerのnewに行くという想定だと思います。
ここを<a href="/reviews/new?post_id=<%= @post.id %> "class="review_link"> とか <%= link_to "この作品をレビューする",review_path(post_id: @post.id)%> の様に。
Reviewを直接呼ぶ方が混乱しにくいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/18 15:12

    回答ありがとうございます!
    1と2をして3を<a href="/reviews/new?post_id=<%= @post.id %> "class="review_link">に変更しました!
    そしたらnullではなく0という数字が入りました!createをbinding.pryしてparamsで見ると入っているきがしますがなぜ0何でしょうか?
    [1] pry(#<ReviewsController>)> params
    => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"dzSCqJJMOFvmCAe/V9a8wVbSdv7T+M7VwKbcSMnpxrG9A4AceoTaoHEdX1pfaHn+hrSpZp/mrwsUbk40v4Ev2Q==", "nickname"=>"あんぱん", "rate"=>"5", "review"=>"面白い作品だった!", "post_id"=>"{:value=>61}", "controller"=>"reviews", "action"=>"create"} permitted: false>
    [2] pry(#<ReviewsController>)>

    キャンセル

  • 2020/01/18 16:59

    あれから試行錯誤してform_forで取れるようになりました!
    ありがとうございました。

    キャンセル

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

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

関連した質問

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