現在、4択問題の機能を実装しています。
その中で、ユーザーが一度正解したら、その後はデータベースに反映されないようにしたいです。
考えた方法としては、
user_idとquiz_idがrankingsモデルに存在している場合→データベースに保存しない
それ以外→データベースに保存する
としたいのですが、そもそもその実装に必要なquiz_idカラムがうまく反映させられません。
クイズモデルとランキングモデルは、1対多の関係で関連性を持たせています。(カラム名も規約通り、quiz_idとしています。)
class Quiz < ApplicationRecord has_many :rankings, dependent: :destroy
class Ranking < ApplicationRecord belongs_to :quiz
RankingsDatabase id|correct|user_id|created_at|updated_at|total_correct|quiz_id 1|1|101|2020-06-07 06:02:24.215425|2020-06-07 06:02:24.215425|0|1 2|1|101|2020-06-07 06:02:28.924287|2020-06-07 06:02:28.924287|1|1 3|1|101|2020-06-07 06:04:25.841869|2020-06-07 06:04:25.841869|2|1 4|1|101|2020-06-07 06:14:05.411589|2020-06-07 06:14:05.411589|3|1
以下の、quiz_id:1は関連性がうまく行かないため、仮です。
quiz_idを書かないとajaxはsuccessになるが、データベースに保存されないため仮にしています。(また、Strongparameterにしても同様)→保存されない理由はよく分かっていません。
class RankingsController < ApplicationController def create # done1 = Ranking.find_by(user_id:current_user.id) # done2 = Ranking.find_by(quiz_id:???) このidの取得方法は考えられていません。 # if done1 && done2 # else # flash ~ correct_numbers = current_user.rankings.where(correct:1).count ranking = Ranking.new(user_id: current_user.id, correct:params[:correct], total_correct:correct_numbers, quiz_id:1) #quiz_idは仮(ajaxがerrorになるため。) ranking.save end # end
Rankings/index.html/erb <div class="col-md-7"> <% @feed_items.each do |f|%> <p id="_question"><️空欄に入る適切な語句を選択肢から選びなさい。><br>Question: <%= f.question %></p> <!--問題を入力--> <ul id="choices"> <%= @answer %> <li onclick="goAnswer(1, <%= f.answer %>)"><%= f.choice_1 %></li> <li onclick="goAnswer(2, <%= f.answer %>)"><%= f.choice_2 %></li> <li onclick="goAnswer(3, <%= f.answer %>)"><%= f.choice_3 %></li> <li onclick="goAnswer(4, <%= f.answer %>)"><%= f.choice_4 %></li> by <%=f.user.name%> </ul> <% end %> </div> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script> <script type="text/javascript"> function goAnswer(selectAnswerNo, correctAnswerNo) { if (selectAnswerNo == correctAnswerNo) { swal("正解です!", "他の問題もチャレンジしてみましょう!", "success"); $.ajax({ type: "POST", beforeSend: function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); }, url: "/rankings", // dataType: "json", data: { "correct": 1, }, success: function (data) { alert("success"); }, error: function (data) { alert("error"); } }); } else { swal("不正解です!", "もう一度チャレンジしてみましょう!", "error"); }; } </script>
Ajaxを使っていることが原因なのでしょうか?どうしても関連がうまく行かないので質問させていただきました。分かる方がいらっしゃいましたらご回答お願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。