rails初学者によるポートフォリオ作成中の学びのアウトプットです。
#実現したい事
クイズアプリを作成中に複数のモードを全てquestionモデルとanswerモデルで賄いたい(ジャンルAのクイズ集とジャンルBのクイズ集を実装する)。下記の二つのページのようにnew_answer_pathからアクセスした時に異なるジャンルの問題が表示されるようにしたい。
(モードA)
ジャンルAの問題を表示
回答欄(answerモデルに保存される)
(モードB)
ジャンルBの問題を表示
回答欄
#実装の流れ
①questionモデルにmode_numカラム(integer)を追加して問題のジャンルを番号で識別するようにする。
②new_answer_path(mode_num: <識別番号>)とし、newアクションにmode_numを渡すようにする。
③newアクションで渡された識別番号からquestionモデルを検索するよう実装する。
#実際のコード
(②のステップから)
問題ジャンルAはquestion.mode_numを1に設定。
問題ジャンルBはquestion.mode_numを2に設定。
<%= link_to "問題を解く", new_answer_path(mode_num: 1) %>
.
.
.
<%= link_to "問題を解く", new_answer_path(mode_num: 2) %>
def new
@questions = Question.where(mode_num: params[:mode_num])
@question = @questions.find(@questions.pluck(:id).sample )
@answer = @question.answers.new
end
@questions = Question.where(mode_num: params[:mode_num])で受け取ったmode_numから該当するジャンルのquestionを配列で取得。
@question = @questions.find(@questions.pluck(:id).sample )で
取得した配列の中からランダムで一つのquestionを取得してそれをviewに表示する。
<%= @question.content %>
<%= form_with(model: @answer, local: true) do |f| %>
<%= f.text_area :content %>
<%= f.submit "次の問題へ進む" %>
<% end %>
これでhome.html.erbの上のリンクと下のリンクからそれぞれアクセスした際、
<%= @question.content %>に違う内容が表示される。