# 環境
rails version 5.2.6
# 完成したコード
// /javascript/title.jsの記述
// 選択肢を取得する
const selects = document.getElementsByClassName("card-footer-item")
// ユーザーからの回答を格納するための配列を用意
let user_ans = ["1","2","3","4","5","6","7"];
//railsから問題の答えを取得する
data_quiz = JSON.parse(document.getElementById('tag_info').dataset.json);
// クリックした時にボタンの色を青色に変更する処理
for(let i=0; i<selects.length; i++){
// クリック情報を取得する
console.log(selects[i])
selects[i].addEventListener("click",function(){
if(i%2==0){
// 左側のボタンの時
//選択肢を初期化(いったん色を外す)
selects[i].className = 'button card-footer-item'
selects[i+1].className = 'button card-footer-item'
// 色を変更する
user_ans[Math.floor(i / 2) ] = selects[i].innerText
selects[i].className = 'button card-footer-item is-primary'
}else{
// 右側のボタンの時
// 選択肢を初期化(いったん色を外す)
selects[i].className = 'button card-footer-item'
selects[i-1].className = 'button card-footer-item'
// 色を変更する
user_ans[ Math.floor(i / 2)] = selects[i].innerText
selects[i].className = 'button card-footer-item is-primary'
console.log(user_ans);
}
})
}
//採点を行うボタンの要素を取得する
const check_ans = document.querySelector("#check");
//正解のマークを表示する場所の要素を取得
const ans_tile = document.querySelectorAll("#ans");
check_ans.addEventListener("click", function(){
// それぞれの項目の回答と正解を比較する
for(let i=0; i<data_quiz.length; i++){
if(data_quiz[i].ans == user_ans[i]){
// 正解のとき
// 要素に値を入れて、正解と書かれたボタンを表示する
ans_tile[i].innerText = "正解"
ans_tile[i].className = "button is-success"
}else{
// 不正解のとき
// 要素に値を入れて、正解と書かれたボタンを表示する
ans_tile[i].innerText = "不正解"
ans_tile[i].className = "button is-warning"
}
}
})
// /views/titles/show.html.erbの記述
<section class="section mt-6">
<div class="container">
<div class="columns is-centered">
<div class="column is-5">
<div class="card mb-6">
<p class="card-header-title">
<%= @title.name %>
</p>
</div>
<% @title.quizs.each do |quiz| %>
// コントローラーから受け取ったデータの埋め込む
<div id="tag_info" data-json="<%= @title.quizs.to_json %>" ></div>
// 採点後に表示するための空の要素
<div class="", id="ans"></div>
<div class="card mb-6">
<header class="card-header">
<div class="card-header-title">
<%= quiz.content%>
</div>
</header>
<footer class="card-footer">
<div class="button card-footer-item">
<%= @title.title %>
</div>
<div class="button card-footer-item" >
<%= @title.title_other %>
</div>
</footer>
</div>
<% end %>
<div class= "button is-info", id ="check">採点する</div>
</div>
</div>
</div>
</section>
<%= javascript_include_tag 'titles.js' %>
# ポイント(学び)
*railsのviewにjavascritpを反映させるには、
要素を取ってくる必要があり、
クラスを指定してとってくる方法には以下である。
・document.getElementsByClassName("任意のクラス名")
・document.querySelector("#check")
idを指定してとってくる
・document.querySelector("#id名")
また、同一のものをすべて取得した場合には
document.querySelectorAll()等のAllをつけた形で利用する
*ユーザーからのイベントを検知したいときは
指定した要素.addEventListener("任意のイベント", function(){
行いたい処理
}