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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1324閲覧

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

sa.k

総合スコア6

Ruby

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/01/17 12:22

編集2020/01/18 07:11

前提・実現したいこと

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にデータが入らないので
ここにより詳細な情報を記載してください。

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

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

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

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

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

Orlofsky

2020/01/17 16:24

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

2020/01/17 16:25

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

回答2

0

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

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

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

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

rb

1# posts_controller.rb 2def create 3 @post = Post.find_by(id: params[:post_id]) # params[:id]ではないはず、未検証。 4 # @post.reviews.build とすることで @post に紐づく reviews を作成できます。 5 # 後から save するのであれば create ではなく build (newでも可) 6 # 変数名がおかしい、中身が単数の場合は単数形の名前を使用すること。 7 @review = @post.reviews.build(nickname: params[:nickname], 8 rate: params[:rate], 9 review: params[:review]) 10 # save ではなく save! とすることで保存に失敗した際にバリデーション結果が出力されるので、原因に気付きやすい 11 if @review.save! 12 redirect_to('/') 13 end 14 # 保存に失敗した時の処理がないので追加しておくこと。 15end

erb

1<%# reviews/new.html.erb %> 2<%# おそらくフォームの送信先がおかしいのできちんと待ち受けているところに向けて送信する %> 3<%= form_tag('posts/#{@post.id}/reviews',{multipart: true}) do %>

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

bash

1$ rails routes

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

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

erb

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

投稿2020/01/18 06:09

編集2020/01/18 06:13
Mugheart

総合スコア2349

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

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

0

ベストアンサー

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/17 22:10

winterboum

総合スコア23347

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

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

sa.k

2020/01/18 06: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>)>
sa.k

2020/01/18 07:59

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問