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

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

ただいまの
回答率

88.78%

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

解決済

回答 1

投稿 編集

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

前提・実現したいこと

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の答えとして取得ができておりません。

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

該当のソースコード

[questions_controller.rb]

class QuestionsController < ApplicationController

  def index
    @questions = Question.all

  end

  def show
    @answer = Answer.find(params[:id])
  end

  private
  def answer_params
    params.require(:answer).permit(:answer, :question_id)
  end

end
[answer.rb]

class Answer < ApplicationRecord
  belongs_to :user
  belongs_to :question

  validates :question, presence: true
  validates_uniqueness_of :question_id, scope: :user_id
end
[question.rb]

class Question < ApplicationRecord
  has_many :users, through: :answers
  has_many :answers
end
[user.rb]

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  # has_many :questions, through: :questions_users
  has_many :answers
  has_many :questions, through: :answers

  validates :name, presence: true, uniqueness: true
end
[answers_controller.rb]

class AnswersController < ApplicationController

  def new
    @question = Question.find(params[:question_id])
    @answer = Answer.new
  end

  def create
    @question = Question.find(params[:question_id])
    @answer = Answer.new(
      answer: answer_params[:answer],
      question_id: params[:question_id],
      user_id: current_user.id
    )

    if @answer.save
      redirect_to questions_path
    else
      render :new
    end
  end

  private
  def answer_params
    params.require(:answer).permit(:answer, :question_id)
  end

end
[show.html.haml]

.body
  = render 'groups/header'
  .contents
    %p.hoge
      = @answer.answer
[routes.rb]

Rails.application.routes.draw do
  devise_for :users
  root "groups#index"
  resources :users, only: [:edit, :update]
  resources :questions, only: [:index, :show] do
    resources :answers, only: [:new, :create]
  end
end
.body

[index.html.haml]

  = render 'groups/header'
  .contents
    .question
      - @questions.each do |q|
        .question__items
          .question__items__item
            =link_to new_question_answer_path(q.id), class:"question__items__item__box"do
              = q.content
          .question__items__show
            = link_to question_path(q.id), class:"question__items__item__box" do
              = "詳細"

試したこと

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

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

Rubyバージョン 2.5.1

answerテーブル 例

id answer qusetion_id user_id
1 記入したanswer 1 1
2 記入したanswer 2 1
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • SurferOnWww

    2020/06/14 11:05

    > Ruby on Railsを使用しております。

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

    キャンセル

  • keisuke_okazaki

    2020/06/14 11:16

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

    キャンセル

  • winterboum

    2020/06/14 11:30

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

    キャンセル

  • keisuke_okazaki

    2020/06/14 11:43

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

    キャンセル

回答 1

checkベストアンサー

+1

二つ問題点があります

  1. Questionモデルでは、一つのQuestionに複数のAnswerが有ることに成っています。
    indexのviewからはquistionのidが渡っているだけなので、
    「1人のユーザーが行った、1つの質問に対しての答えを表示」するときに、どのユーザの答えを表示すべきなのか、が決定できません。ここはどう考えていますか?
  2. 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 12: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)
    の記述となっております。
    ここでの引数も間違っている可能性があるとい自分では想定しているのですが、解決方法に悩んでおります。

    キャンセル

  • 2020/06/14 12:50

    前提の詳細の説明が伝わりづらい文章になっておりまして申し訳ございません。

    前提としてやりたいこととしては、
    質問に関しましては全ユーザー同じ質問に回答していただきます。なので質問に関しましてはどのユーザーであろうと固定の質問で同じものになります。
    その質問を複数用意しております。

    答えについては、その1つの質問に対して1人のユーザーが1つだけ行っていただくかたちとなります。

    詳細の表示としましてはユーザー視点で例えると、自分が質問に対して行った回答を質問ごとに回答を確認ができるようにしたいと考えております。
    例 
    ユーザーaさんが質問⑤に回答。
    あとでユーザーaさんが自分が質問⑤に対しての答えがなにだったか確認したい。
    そこで質問の下にある詳細ボタンを押すと、ユーザーaさん自身が質問⑤に対して回答した答えを確認できる、といった使用になります。

    その自分が行った質問に対しての回答部分を詳細ページで確認する為の記述が分からずに困っております。
    基礎的な知識がまだ不安定ということもありますが、何卒よろしくお願いいたします。

    キャンセル

  • 2020/06/14 15:29

    ご回答ありがとうございます!
    @answer = Answer.find_by(question_id: params[:id],user_id: current_user.id)
    こちらで解決することができました。

    最初からご丁寧に教えていただきありがとうございます。
    もっと勉強して知識を付けていきたいと思います。

    キャンセル

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

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

関連した質問

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