1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】同名のパスのviewで表示するインスタンスを使い分ける

Last updated at Posted at 2021-09-16

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に設定。

home.html.erb
 <%= link_to "問題を解く", new_answer_path(mode_num: 1) %>
.
.
.
 <%= link_to "問題を解く", new_answer_path(mode_num: 2) %>
answer_controller.rb
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に表示する。

new.html.erb

   <%= @question.content %>

   <%= form_with(model: @answer, local: true) do |f| %>
 

     <%= f.text_area :content %>
    
     <%= f.submit "次の問題へ進む" %>
   <% end %>

これでhome.html.erbの上のリンクと下のリンクからそれぞれアクセスした際、
<%= @question.content %>に違う内容が表示される。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?