前提・実現したいこと
選択肢のあるクイズサイトをRuby on Railsを用いて作成しています。クイズのジャンルと選択肢をモデル間で繋げたいです。
###実現するために
用意したもの
・postsモデル (クイズのジャンルが入っている)
・quizzesモデル (各ジャンルの問題文と選択肢が入っている)
「1つ」のジャンルに対して「多く」の問題と選択肢があるので、1対多の関係であります。Postsモデルのpost_idをうまいことQuizzesモデルに登録できるようにするためにするのが課題です。
###お聞きしたいこと
postモデルのidをどうやったらquizzesモデルのカラム「post_id」に登録できるか
調べたこと
一番多く見つかった方法は、gemのdevise機能を用いて、「現在ログイン中のユーザーのID」をdeviseのメソッド「current_user.id」で引っ張ってきて、それをコントローラーで、たとえば以下のように登録する方法です。
private def tweet_params params.require(:tweet).permit(:image, :text).merge(user_id: current_user.id) end end
これをコントローラー内のcreateアクションにて呼び出し、登録します。ですが今回実現したいのは、任意に選択したクイズのジャンルのidをQuizzesモデルに登録したいので、この方法は使えません。
postsコントローラーのソースコード
class PostsController < ApplicationController def index @posts = Post.all end def new @post = Post.new end def create Post.create(post_params) end def show @post = Post.find(params[:id]) end private def post_params params.require(:post).permit(:title, :content) end end
quizzesコントローラーのソースコード
class QuizzesController < ApplicationController def new @quiz = Quiz.new end def create Quiz.create!(quiz_params) redirect_to root_path end def show end private def quiz_params params.require(:quiz).permit(:question, :answerA, :answerB, :answerC) end end
###Routes.rbのソースコード
Rails.application.routes.draw do root to: 'posts#index' resources :posts, only: [:index, :new, :create, :show] resources :quizzes, only: [:new, :create, :show] end
###postsモデルのソースコード
class Post < ApplicationRecord validates :title, presence: true has_many :quizzes end
###quizzesモデルのソースコード
class Quiz < ApplicationRecord validates :question, :answerA, :answerB, :answerC, presence: true belongs_to :post, optional: true end
補足情報(FW/ツールのバージョンなど)
以下のURL先の質問の後半にて、同じような質問が見られました。
https://teratail.com/questions/117074
初質問です。質問内容にて修正・改善した方がいい点がありましたらご指摘ください。
あなたの回答
tips
プレビュー