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

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

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

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

Q&A

解決済

1回答

1327閲覧

外部キーのidとurlのid を一致させて詳細情報を表示させたい

keisuke_okazaki

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/14 01:59

編集2020/06/14 02:42

前提・実現したいこと

Ruby on Railsを使用しております。勉強期間1ヶ月の初心者です。

前提
ユーザーにいくつか構えている質問に答えてもらい、その質問に対しての答えを詳細としてみることができる、といった機能を作ろうとしております。
1人のユーザーが1つの質問に対しての答えは1つのみです。

テーブルとしては
user
question
answer
の3つです

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

解決したいこととしては、詳細ページで1人のユーザーが行った、1つの質問に対しての答えを表示させたいがやり方が分からない。
外部キー(answerテーブルのquestion_id)とurl(params[:id])の id を一致させたい。
questionに対しての詳細なので、questionコントローラでの記述が必要だと思いshowアクションで試しで記述しておりますがこちらの記述だとanswerテーブルのidの取得になっており、questionと一致しておらずquestionの答えとして取得ができておりません。

非常に分かりづらい説明になっていると思いますが、何卒よろしくお願いいたします。

該当のソースコード

ruby

1[questions_controller.rb] 2 3class QuestionsController < ApplicationController 4 5 def index 6 @questions = Question.all 7 8 end 9 10 def show 11 @answer = Answer.find(params[:id]) 12 end 13 14 private 15 def answer_params 16 params.require(:answer).permit(:answer, :question_id) 17 end 18 19end

ruby

1[answer.rb] 2 3class Answer < ApplicationRecord 4 belongs_to :user 5 belongs_to :question 6 7 validates :question, presence: true 8 validates_uniqueness_of :question_id, scope: :user_id 9end

ruby

1[question.rb] 2 3class Question < ApplicationRecord 4 has_many :users, through: :answers 5 has_many :answers 6end 7

ruby

1[user.rb] 2 3class User < ApplicationRecord 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 7 # has_many :questions, through: :questions_users 8 has_many :answers 9 has_many :questions, through: :answers 10 11 validates :name, presence: true, uniqueness: true 12end

ruby

1[answers_controller.rb] 2 3class AnswersController < ApplicationController 4 5 def new 6 @question = Question.find(params[:question_id]) 7 @answer = Answer.new 8 end 9 10 def create 11 @question = Question.find(params[:question_id]) 12 @answer = Answer.new( 13 answer: answer_params[:answer], 14 question_id: params[:question_id], 15 user_id: current_user.id 16 ) 17 18 if @answer.save 19 redirect_to questions_path 20 else 21 render :new 22 end 23 end 24 25 private 26 def answer_params 27 params.require(:answer).permit(:answer, :question_id) 28 end 29 30end

haml

1[show.html.haml] 2 3.body 4 = render 'groups/header' 5 .contents 6 %p.hoge 7 = @answer.answer

ruby

1[routes.rb] 2 3Rails.application.routes.draw do 4 devise_for :users 5 root "groups#index" 6 resources :users, only: [:edit, :update] 7 resources :questions, only: [:index, :show] do 8 resources :answers, only: [:new, :create] 9 end 10end

ruby

1.body 2 3[index.html.haml] 4 5 = render 'groups/header' 6 .contents 7 .question 8 - @questions.each do |q| 9 .question__items 10 .question__items__item 11 =link_to new_question_answer_path(q.id), class:"question__items__item__box"do 12 = q.content 13 .question__items__show 14 = link_to question_path(q.id), class:"question__items__item__box" do 15 = "詳細"

試したこと

questionコントローラのshowアクションの記述の仕方について検索してみたが解決方法を見つけることができなかった。

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

Rubyバージョン 2.5.1

answerテーブル 例
|id|answer|qusetion_id|user_id|
|:--|:--:|--:|
|1|記入したanswer|1|1|
|2|記入したanswer|2|1|

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/14 02:05

> Ruby on Railsを使用しております。 その関係のタグをつけてください。興味のある人の目を引いて回答が得やすくなるかもしてません。(逆に、興味のない自分のような閲覧者の場合はタグだけ見て中身を見ないで済みますし)
keisuke_okazaki

2020/06/14 02:16

かしこまりました! アドバイスありがとうございます。
winterboum

2020/06/14 02:30

showアクションを呼ぶviewのcodeを載せてください
keisuke_okazaki

2020/06/14 02:43

showアクションを呼ぶviewのコードを追加させていただきました。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

二つ問題点があります

  1. Questionモデルでは、一つのQuestionに複数のAnswerが有ることに成っています。

indexのviewからはquistionのidが渡っているだけなので、
「1人のユーザーが行った、1つの質問に対しての答えを表示」するときに、どのユーザの答えを表示すべきなのか、が決定できません。ここはどう考えていますか?

  1. link_to new_question_answer_path(q.id) となっていますが、このpathは新しいAnswerを作る時のpathに見えますので、newに行ってしまいませんか?それもAnswerの。

もしこれでQuestion のshowに行くとするとrails標準のroutes.rbの記述ではない? routes.rbも載せて頂く必要がありそうです。

追記
失礼、link_to question_path(q.id)こっちですね。見落としてました。
で、ここの書き方自体は合っています。
問題は、複数有るであろう答えのなかで誰の答えを表示するのか、が渡らないということです。
「answerのidを渡す」のでも良いのですが、そのidはどうやって選ぶ?
もしかして私の読み損ないかな
「1人のユーザーが行った、1つの質問に対しての答え」というので、複数有る回答の中の特定の「一人のユーザ」の答え かと思っていたのですが
一つの質問に対しての「一人のユーザが書いた一つの答え」を全ユーザ分表示するのですか?

追記
その質問についての、loginしている人の回答ですね?
でしたら、
@answer = Question.find(params[:id]).answers.where(user_id: current_user.id).first
これでも行けたかな
@answer = Question.find(params[:id]).answers.find_by(user_id: current_user.id)
ああ、Question通さなくてもよいか
@answer = Answer.find_by(question_id: params[:id],user_id: current_user.id)

投稿2020/06/14 03:00

編集2020/06/14 04:53
winterboum

総合スコア23329

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

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

keisuke_okazaki

2020/06/14 03:17

回答ありがとうございます。 1. につきましては、answerのidをコントローラでインスタンス変数で定義し渡すべきという認識でよろしいでしょうか? 2. につきましては、 link_to new_question_answer_path(q.id) のpathはshowへのpathではなく、answerを記述するためのnewアクションへのpathとなっています。 showアクションへのpathはその下に記述しております、 link_to question_path(q.id) の記述となっております。 ここでの引数も間違っている可能性があるとい自分では想定しているのですが、解決方法に悩んでおります。
keisuke_okazaki

2020/06/14 03:50

前提の詳細の説明が伝わりづらい文章になっておりまして申し訳ございません。 前提としてやりたいこととしては、 質問に関しましては全ユーザー同じ質問に回答していただきます。なので質問に関しましてはどのユーザーであろうと固定の質問で同じものになります。 その質問を複数用意しております。 答えについては、その1つの質問に対して1人のユーザーが1つだけ行っていただくかたちとなります。 詳細の表示としましてはユーザー視点で例えると、自分が質問に対して行った回答を質問ごとに回答を確認ができるようにしたいと考えております。 例  ユーザーaさんが質問⑤に回答。 あとでユーザーaさんが自分が質問⑤に対しての答えがなにだったか確認したい。 そこで質問の下にある詳細ボタンを押すと、ユーザーaさん自身が質問⑤に対して回答した答えを確認できる、といった使用になります。 その自分が行った質問に対しての回答部分を詳細ページで確認する為の記述が分からずに困っております。 基礎的な知識がまだ不安定ということもありますが、何卒よろしくお願いいたします。
keisuke_okazaki

2020/06/14 06:29

ご回答ありがとうございます! @answer = Answer.find_by(question_id: params[:id],user_id: current_user.id) こちらで解決することができました。 最初からご丁寧に教えていただきありがとうございます。 もっと勉強して知識を付けていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問