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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

5回答

994閲覧

クイズで同じ問題を出さない方法、次の問題で問〇を1増やす方法、最後に得点を表示する方法

papanchoi0523

総合スコア1

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/05/25 08:04

編集2021/06/06 13:33

前提・実現したいこと

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ページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2021/05/25 10:13

loginしてやるのですか、login不要ですか 今回始めてからの得点累積、同じ問題出さない なのか 今までの利用実績も含めて 同じ問題を出さない、得点累積なのか どちらでしょう
papanchoi0523

2021/05/25 23:45

おはようございます。 ログインはせずに使えるようにします。 いままでの実績は関係なく、topページの「試験開始」を押したら0点から+2していきたいです。全部の問題が終わったら、再度やる場合はリセットした状態から?と申せばよいのでしょうか。 出題に関しても同じで、今までの利用実績は関係なく、そのテスト中だけ出題されなくしたいです。 質問内容が足りずもうしわけございません。どうぞよろしくお願い申し上げます。
guest

回答5

0

私が「loginしてやるのですか、login不要ですか」と質問し、
tacsheaven さんが「「画面間の情報は、明示的に引き継ぐ処理をしない限り引き継がれない」ことを憶えておきましょう。」 と解説している
のは同じ問題を指摘しています。tacsheavenさんの回答にたいするあなたのコメントを見ると、そこを全く理解してくれていません。
一度出した問題を記録に残すということを「一度表示したIDのレコードを新たなテーブルに.newで作成し」ということでは解決しません。loginしていないのですから誰に出した問題なのかがそれでは判断出来ない。

loginさせる場合は、user_idとともにしまえば判断できますが、loginさせないとすると、tacsheavenさんの回答にあるように、「「別画面でも必要な情報」は、画面にパラメータで渡すか、あるいはセッションやクッキーを使用して保存するなどして、引き継がせなければなりません。」です

投稿2021/05/26 23:15

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papanchoi0523

2021/05/28 01:24

ご説明ありがとうございます。問の連番、スコア、一度表示した問題は全てparamsでviewからcontrollerに渡してやってみます。また、新たなアクションに変数をつくり、一度表示した問題をその変数に代入していき、「htmlではif文でランダム表示する際に、一度表示した問題を入れた変数だったら表示しない」という方法なのでしょうか。 たとえばdone = @drone_questions で今ランダム表示した問題を代入し、次からはif文で ``` <% if @drone_questions != done %> <%= @drone_questions %> end ``` のような形?のイメージになっています。とりあえず問の連番の問題から解決していこうとしていますがいまだ未解決です。色々と教えてくださりありがとうございます(#^.^#)
winterboum

2021/05/28 01:59 編集

viewで判断することもできますが、私の好みとしてはviewではあまりプログラムしたくありません。 controllerかmodelでやります。例えば DroneQuestion.order("RANDOM()").first ↓ DroneQuestion.where.not(id: すでに出した問題のidの配列).order("RANDOM()").first
papanchoi0523

2021/05/28 09:30

出来るだけviewではプログラムしないのですね。そうしてみますありがとうございます。 詳しく教えて頂きありがとうございます。既出を出題しないコードはこれを真似してみます。 丁度今、問の連番についてやっと解決しテンションが上がっておりました(#^^#) 解決方法の部分に書きます。引き続き既出問題を表示しないようにする部分についてがんばります(*^-^*)
guest

0

まず、Rails に限らずですが、Web アプリケーションは「画面間の情報は、明示的に引き継ぐ処理をしない限り引き継がれない」ことを憶えておきましょう。
別画面に遷移する場合に、「別画面でも必要な情報」は、画面にパラメータで渡すか、あるいはセッションやクッキーを使用して保存するなどして、引き継がせなければなりません。

そしてそれが理解できたら、問の連番が変わらないこと、スコアも増えていかないことが理解できているはずです。

一度表示した問題を表示しないためには、「一度表示した問題のリスト」がないといけません(そのリストに入っている問題は表示対象としない)。これも「画面間で引き継ぐべき情報」です。

投稿2021/05/26 00:50

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papanchoi0523

2021/05/26 04:19

こんにちは。ご返信ありがとうございます。 問とスコアはparams でやってみます。 問題はDBからランダム取得しているのですが、一度表示したIDのレコードを新たなテーブルに.newで作成し、DB2つをJOINして、どちらにもあてはまるもののみ表示する。where と and を使ってという事でしょうか?
guest

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

papanchoi0523

総合スコア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

papanchoi0523

総合スコア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
papanchoi0523

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問