前提・実現したいこと
railsでクイズアプリを作っています。最初の2つ解決することが出来ました。本当にありがとうございます。
- データベースからランダム取得している問題を、一度取得したものは表示しないようにしたい
どうしてもこれだけがわかりません。
発生している問題・エラーメッセージ
-教わった @drone_questions = DroneQuestion.where.not(id:表示したID)order("RANDOM()").first
を使ってみています。
自己解決のソースコードの通り表示したIDをparamsで受け取り@donesに入れ、以下のようにやっていますがうまくいきません。最後の壁と思ってがんばりたいです。少し知恵を頂きたいです。
予想のソースコード
homecontroller
1def overtest2 2@drone_questions = DroneQuestion.order("RANDOM()").first 3if @dones != @drone_questions.id 4 @dones.push(@drone_questions.id) 5else 6@drone_questions = DroneQuestion.where.not(id:@dones)order("RANDOM()").first 7end 8end
2つ解決したコードは自己解決の欄に書きましたが、これを追加してもうまくいかないので解決欄には書いておりません。
どうか知恵をお貸しください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/25 23:45
回答5件
0
私が「loginしてやるのですか、login不要ですか」と質問し、
tacsheaven さんが「「画面間の情報は、明示的に引き継ぐ処理をしない限り引き継がれない」ことを憶えておきましょう。」 と解説している
のは同じ問題を指摘しています。tacsheavenさんの回答にたいするあなたのコメントを見ると、そこを全く理解してくれていません。
一度出した問題を記録に残すということを「一度表示したIDのレコードを新たなテーブルに.newで作成し」ということでは解決しません。loginしていないのですから誰に出した問題なのかがそれでは判断出来ない。
loginさせる場合は、user_idとともにしまえば判断できますが、loginさせないとすると、tacsheavenさんの回答にあるように、「「別画面でも必要な情報」は、画面にパラメータで渡すか、あるいはセッションやクッキーを使用して保存するなどして、引き継がせなければなりません。」です
」
投稿2021/05/26 23:15
総合スコア23567
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/28 01:24
2021/05/28 01:59 編集
2021/05/28 09:30
0
まず、Rails に限らずですが、Web アプリケーションは「画面間の情報は、明示的に引き継ぐ処理をしない限り引き継がれない」ことを憶えておきましょう。
別画面に遷移する場合に、「別画面でも必要な情報」は、画面にパラメータで渡すか、あるいはセッションやクッキーを使用して保存するなどして、引き継がせなければなりません。
そしてそれが理解できたら、問の連番が変わらないこと、スコアも増えていかないことが理解できているはずです。
一度表示した問題を表示しないためには、「一度表示した問題のリスト」がないといけません(そのリストに入っている問題は表示対象としない)。これも「画面間で引き継ぐべき情報」です。
投稿2021/05/26 00:50
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/26 04:19
0
(結局自己解決できず、プロに教わりながらやりました)
routes
1Rails.application.routes.draw do 2 3 get "top"=> "home#top" 4 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html 5 get "/home/exam" => "home#exam" 6 get "/home/overtest2" => "home#exam" 7 post "/home/overtest2" => "home#overtest2" 8end
exam
1<% @point = 0 %> 2<% @firsttoi = 1 %> 3<h1><%= "問#{@firsttoi}" %></h1> 4<%= @drone_questions.q %> 5<%= button_to @drone_questions.choice1 , "/home/overtest2", { method: :post, params: {choice1: @drone_questions.choice1, answer: @drone_questions.answer, toi: @firsttoi, dones: [@drone_questions.id], score: @point}} %> 6<%= button_to @drone_questions.choice2 , "/home/overtest2", { method: :post, params: {choice2: @drone_questions.choice2, answer: @drone_questions.answer, toi: @firsttoi, dones: [@drone_questions.id], score: @point}} %> 7<%= button_to @drone_questions.choice3 , "/home/overtest2", { method: :post, params: {choice3: @drone_questions.choice3, answer: @drone_questions.answer, toi: @firsttoi, dones: [@drone_questions.id], score: @point}} %> 8<%= button_to @drone_questions.choice4 , "/home/overtest2", { method: :post, params: {choice4: @drone_questions.choice4, answer: @drone_questions.answer, toi: @firsttoi, dones: [@drone_questions.id], score: @point}} %> 9
overtest2
1<% if @right %> 2<%= @right %> 3<% else %> 4<%= @wrong %> 5<% end %> 6</p> 7 8<% if @drone_questions.present? %> 9 10<!-- いったん間違っても得点を表示するようにしました --> 11<p> 12現在の得点は<%= @scores %>点です。 13</p> 14 15<h1><%= "問#{@toi}" %></h1> 16<%= @drone_questions.q %> 17<%= button_to @drone_questions.choice1 , "/home/overtest2", { method: :post, params: {choice1: @drone_questions.choice1, answer: @drone_questions.answer, toi: @toi, dones: @dones, score: @scores}} %> 18<%= button_to @drone_questions.choice2 , "/home/overtest2", { method: :post, params: {choice2: @drone_questions.choice2, answer: @drone_questions.answer, toi: @toi, dones: @dones, score: @scores}} %> 19<%= button_to @drone_questions.choice3 , "/home/overtest2", { method: :post, params: {choice3: @drone_questions.choice3, answer: @drone_questions.answer, toi: @toi, dones: @dones, score: @scores}} %> 20<%= button_to @drone_questions.choice4 , "/home/overtest2", { method: :post, params: {choice4: @drone_questions.choice4, answer: @drone_questions.answer, toi: @toi, dones: @dones, score: @scores}} %> 21 22<% else %> 23 24あなたの得点は<%= @scores %>点でした。 25<p> 26<%= link_to "戻る", '/home/exam' %> 27<% end %>
homecontroller
1class HomeController < ApplicationController 2 before_action :exam, only: [:overtest2] 3 def top 4 5 end 6 7 def exam 8 # ランダムに問題を1問抽出 9 @drone_questions = DroneQuestion.order("RANDOM()").first 10 end 11 12 def overtest2 13 # パラメータ受け取り 14 @choice1 = params[:choice1] 15 @choice2 = params[:choice2] 16 @choice3 = params[:choice3] 17 @choice4 = params[:choice4] 18 @answer = params[:answer] # 本来なら正解は問題文表示に渡さずDBから取ってくるべき 19 @toi = params[:toi] 20 @toi = @toi.to_i + 1 21 @dones = params[:dones] # これまで回答した問題ID(html側も配列で持つように変更済み) 22 @done = @dones.last # 最後に回答した問題ID 23 @scores = params[:score] 24 25 if @choice1 == @answer 26 @right = "正解です!" 27 @scores = @scores.to_i + 2 28 else 29 @wrong = "間違いです。正解は、「#{@answer}」です。" 30 @scores = @scores.to_i + 0 31 end 32 if @choice2 == @answer 33 @right = "正解です!" 34 @scores = @scores.to_i + 2 35 else 36 @wrong = "間違いです。正解は、「#{@answer}」です。" 37 @scores = @scores.to_i + 0 38 end 39 if @choice3 == @answer 40 @right = "正解です!" 41 @scores = @scores.to_i + 2 42 else 43 @wrong = "間違いです。正解は、「#{@answer}」です。" 44 @scores = @scores.to_i + 0 45 end 46 if @choice4 == @answer 47 @right = "正解です!" 48 @scores = @scores.to_i + 2 49 else 50 @wrong = "間違いです。正解は、「#{@answer}」です。" 51 @scores = @scores.to_i + 0 52 end 53 54 @drone_questions = DroneQuestion.where.not(id: @dones).order("RANDOM()").first 55 if @drone_questions.present? 56 # 次の問題がある 57 @dones.push(@drone_questions.id); # 次の問題IDを履歴に追加 58 end 59 end 60end
投稿2021/06/15 23:36
総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自己解決
正解ごとに得点を2点づつ増やすことに成功しました。教わった通りparamsで受け取りました。正解なら+2だけでなく外れなら+0としないと、一度外れた場合また0点からスタートしてしまいましたのでif文にelseで+0が必要です。
examhtmlerb
1<% @point = 0 %> 2<% @firsttoi = 1 %> 3<h1><%= "問#{@firsttoi}" %></h1> 4<%= @drone_questions.q %> 5<%= button_to @drone_questions.choice1 , "/home/overtest2", { method: :get, params: {choice1: @drone_questions.choice1, answer: @drone_questions.answer, toi: @firsttoi, done: @drone_questions.id, score: @point}} %> 6<%= button_to @drone_questions.choice2 , "/home/overtest2", { method: :get, params: {choice2: @drone_questions.choice2, answer: @drone_questions.answer, toi: @firsttoi, done: @drone_questions.id, score: @point}} %> 7<%= button_to @drone_questions.choice3 , "/home/overtest2", { method: :get, params: {choice3: @drone_questions.choice3, answer: @drone_questions.answer, toi: @firsttoi, done: @drone_questions.id, score: @point}} %> 8<%= button_to @drone_questions.choice4 , "/home/overtest2", { method: :get, params: {choice4: @drone_questions.choice4, answer: @drone_questions.answer, toi: @firsttoi, done: @drone_questions.id, score: @point}} %>
overtest2htmlerb
1<p> 2<% if @right %> 3<%= @right %> 4<br> 5<p> 6現在の得点は<%= @scores %>点です。 7</p> 8<% else %> 9<%= @wrong %> 10<% end %> 11</p> 12<h1><%= "問#{@toi}" %></h1> 13<%= @drone_questions.q %> 14<%= button_to @drone_questions.choice1 , "/home/overtest2", { method: :get, params: {choice1: @drone_questions.choice1, answer: @drone_questions.answer, toi: @toi, done: @drone_questions.id, score: @scores}} %> 15<%= button_to @drone_questions.choice2 , "/home/overtest2", { method: :get, params: {choice2: @drone_questions.choice2, answer: @drone_questions.answer, toi: @toi, done: @drone_questions.id, score: @scores}} %> 16<%= button_to @drone_questions.choice3 , "/home/overtest2", { method: :get, params: {choice3: @drone_questions.choice3, answer: @drone_questions.answer, toi: @toi, done: @drone_questions.id, score: @scores}} %> 17<%= button_to @drone_questions.choice4 , "/home/overtest2", { method: :get, params: {choice4: @drone_questions.choice4, answer: @drone_questions.answer, toi: @toi, done: @drone_questions.id, score: @scores}} %>
homecontroller
1before_action :exam, only: [:overtest2] 2 def top 3 4 end 5 6 def exam 7 @drone_questions = DroneQuestion.order("RANDOM()").first 8 9 end 10 11 def overtest2 12 13 @choice1 = params[:choice1] 14 @choice2 = params[:choice2] 15 @choice3 = params[:choice3] 16 @choice4 = params[:choice4] 17 @answer = params[:answer] 18 @toi = params[:toi] 19 @toi = @toi.to_i + 1 20 @dones = params[:done] 21 @scores = params[:score] 22 23 24 if @choice1 == @answer 25 @right = "正解です!" 26 @scores = @scores.to_i + 2 27 else 28 @wrong = "間違いです。正解は、「#{@answer}」です。" 29 @scores = @scores.to_i + 0 30 end 31 if @choice2 == @answer 32 @right = "正解です!" 33 @scores = @scores.to_i + 2 34 else 35 @wrong = "間違いです。正解は、「#{@answer}」です。" 36 @scores = @scores.to_i + 0 37 end 38 if @choice3 == @answer 39 @right = "正解です!" 40 @scores = @scores.to_i + 2 41 else 42 @wrong = "間違いです。正解は、「#{@answer}」です。" 43 @scores = @scores.to_i + 0 44 end 45 if @choice4 == @answer 46 @right = "正解です!" 47 @scores = @scores.to_i + 2 48 else 49 @wrong = "間違いです。正解は、「#{@answer}」です。" 50 @scores = @scores.to_i + 0 51 end 52 DroneQuestion.where.not(id: @dones).order("RANDOM()").first 53 54 end 55end
投稿2021/06/06 13:05
総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
問〇を次の問題に行くたびに1ずつ増やすことが出来ました。
button_toに問〇の部分のパラメータを渡してもらい、homecontrollerで受け取り@toiに代入しました。そして、@toiを+1したかったので@toi+=1しか頭になく、どこをどうやってもエラーでしたが、@toi=@toi.to_iにする事で解決しました。【変更点:firsttoiはデータベースから取得せず最初だけHTMLに直接書きました。また、やはり+1が必要だったので@toi = @toi.to_i + 1で解決しました。】
examhtmlerb
1<% @firsttoi = 1 %> 2<h1><%= "問#{@firsttoi}" %></h1> 3<%= @drone_questions.q %> 4<%= button_to @drone_questions.choice1 , "/home/overtest2", { method: :get, params: {choice1: @drone_questions.choice1, answer: @drone_questions.answer, toi: @firsttoi}} %> 5<%= button_to @drone_questions.choice2 , "/home/overtest2", { method: :get, params: {choice2: @drone_questions.choice2, answer: @drone_questions.answer, toi: @firsttoi}} %> 6<%= button_to @drone_questions.choice3 , "/home/overtest2", { method: :get, params: {choice3: @drone_questions.choice3, answer: @drone_questions.answer, toi: @firsttoi}} %> 7<%= button_to @drone_questions.choice4 , "/home/overtest2", { method: :get, params: {choice4: @drone_questions.choice4, answer: @drone_questions.answer, toi: @firsttoi}} %>
homecontroller
1def exam 2 @drone_questions = DroneQuestion.order("RANDOM()").first 3 4 end 5 6 def overtest2 7 @choice1 = params[:choice1] 8 @choice2 = params[:choice2] 9 @choice3 = params[:choice3] 10 @choice4 = params[:choice4] 11 @answer = params[:answer] 12 @toi = params[:toi] 13 @toi = @toi.to_i + 1 14 15
投稿2021/05/28 09:44
編集2021/06/03 07:37総合スコア1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。