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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

718閲覧

JavaScriptでクイズのようなアプリを動かしたい

daicheez

総合スコア1

Ruby on Rails 6

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/01/27 09:10

前提・実現したいこと

環境:Ruby on Rails, JavaScript

JavaScriptにて見本のようなクイズアプリを作りたいです。
見本→https://codepen.io/programjp/pen/GRveReO?editors=1011

少し改編し、問題として画像を見せ選択肢の中から答えを選んでもらうようにしています。
見本アプリでは回答ごとに次の問題が表示されますが、現在私のコードでは1問目もしくは2問目が表示され、回答を押してもエラーが出て進みません。

発生している問題・エラーメッセージ

コンソールでは

Uncaught ReferenceError: answerCheck is not defined at HTMLButtonElement.onclick (easy1:33:67) onclick @ easy1:33

とanswerCheckが無いと言われます

該当のソースコード

easy1.html.erb

1<div class="question"> 2 <h2>当てはまるものを一つ選びましょう</h2> 3 <div class="image-question"> 4 <img src="/assets/hyoujityu.png" id="_question"><h2>はどれ?</h2> 5 </div> 6 <ul> 7 <li id="_ans1">回答1</li> 8 <li id="_ans2">回答2</li> 9 <li id="_ans3">回答3</li> 10 <li id="_ans4">回答4</li> 11 </ul> 12 <button type="button" id="_answer_1" onclick="answerCheck(1)">回答1</button> 13 <button type="button" id="_answer_2" onclick="answerCheck(2)">回答2</button> 14 <button type="button" id="_answer_3" onclick="answerCheck(3)">回答3</button> 15 <button type="button" id="_answer_4" onclick="answerCheck(4)">回答4</button> 16 </div>

training.js

1window.addEventListener('DOMContentLoaded', function() { 2 let Question = [ 3 ["/assets/apple.png", 4 "1. ズボン", 5 "2. りんご", 6 "3. 時計", 7 "4. 電話", 8 "2"], 9 ["/assets/pc.png", 10 "1. 雪", 11 "2. お腹", 12 "3. パソコン", 13 "4. ちくわ", 14 "3"], 15 ["/assets/cop.png", 16 "1. 塩", 17 "2. まつ毛", 18 "3. 500円玉", 19 "4. コップ", 20 "4"], 21 ["/assets/fish.png", 22 "1. ピラミッド", 23 "2. 魚", 24 "3. カラス", 25 "4. 石", 26 "2"], 27 ["/assets/cat.png", 28 "1. 目", 29 "2. 猫", 30 "3. スプーン", 31 "4. 兄", 32 "2"], 33 ["/assets/socks.png", 34 "1. 本", 35 "2. 花", 36 "3. はさみ", 37 "4. 靴下", 38 "4"], 39 ["/assets/bag.png", 40 "1. かばん", 41 "2. 地球", 42 "3. ボンド", 43 "4. ペンギン", 44 "1"], 45 ["/assets/chingensai.png", 46 "1. タコライス", 47 "2. 学校", 48 "3. ちんげん菜", 49 "4. カーペット", 50 "3"], 51 ["/assets/clock.png", 52 "1. 鉛筆", 53 "2. お茶", 54 "3. ねずみ", 55 "4. 時計", 56 "2"], 57 ["/assets/apple.png", 58 "1. ズボン", 59 "2. りんご", 60 "3. 時計", 61 "4. 電話", 62 "2"], 63 ]; 64 // 問題を表示するオブジェクトを取得する 65 let Q = document.getElementById('_question'); 66 // 問題を表示するオブジェクトを取得する 67 let A1 = document.getElementById('_ans1'); 68 let A2 = document.getElementById('_ans2'); 69 let A3 = document.getElementById('_ans3'); 70 let A4 = document.getElementById('_ans4'); 71 // 正解数を保持する値 72 let Correct = 0; 73 // 現在の問題数 74 let Qcnt = 0; 75 // 問題を画面に表示する処理 76 function Q_Set() { 77 Q.innerHTML = _question.setAttribute('src',Question[Qcnt][0]); 78 A1.textContent = Question[Qcnt][1]; 79 A2.textContent = Question[Qcnt][2]; 80 A3.textContent = Question[Qcnt][3]; 81 A4.textContent = Question[Qcnt][4]; 82 }; 83 // 画面に表示 84 Q_Set(); 85 // 回答ボタンを押したときの処理 86 function answerCheck(ans) { 87 if(ans == Question[Qcnt][5]) { 88 alert("正解"); 89 Correct++; 90 } else { 91 alert("不正解"); 92 } 93 Qcnt++; 94 if (Qcnt == Question.length) { 95 Q.textContent = `お疲れ様でした!10問中、正解数は${Correct}でした。`; 96 A1.textContent = ""; 97 A2.textContent = ""; 98 A3.textContent = ""; 99 A4.textContent = ""; 100 } else { 101 // 画面に表示 102 Q_Set(); 103 } 104 } 105 return answerCheck(); 106});

application.html.erb

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 5 <title></title> 6 <%= csrf_meta_tags %> 7 <%= csp_meta_tag %> 8 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 9 <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 10 <link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP:400,700,900&display=swap" rel="stylesheet"> 11 </head> 12 13 <body> 14 <%= yield %> 15 </body> 16</html>

application.js

1// This file is automatically compiled by Webpack, along with any other files 2// present in this directory. You're encouraged to place your actual application logic in 3// a relevant structure within app/javascript and only use these pack files to reference 4// that code so it'll be compiled. 5 6require("@rails/ujs").start() 7require("turbolinks").start() 8require("@rails/activestorage").start() 9require("channels") 10require("../training") 11 12 13// Uncomment to copy all static images under ../images to the output folder and reference 14// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) 15// or the `imagePath` JavaScript helper below. 16// 17// const images = require.context('../images', true) 18// const imagePath = (name) => images(name, true)

試したこと

調べたところ、関数の中にある関数はスコープ内に閉じ込められ外部では参照できないため、明示する必要があるとのことでした。
そこで「training.js」内の下から2行に「return answerCheck();」を追記しました。
しかし結果は変わらず「Uncaught ReferenceError: answerCheck is not defined」が出てしまします。

補足情報(FW/ツールのバージョンなど)

ruby '2.6.5'
rails '~> 6.0.0'

なかなか解決できず困っております。どのたかお力添えして頂けると助かります!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

return answerCheck();

window.answerCheck = answerCheck;

上記のように変更すれば、動作はするはずです。


関数の中にある関数はスコープ内に閉じ込められ外部では参照できないため、明示する必要があるとのことでした。

これはごもっともです。

そこで「training.js」内の下から2行に「return answerCheck();」を追記しました。

これは、おかしいです。上記の問題の解決策として意味をなしていません。

グローバル変数やスコープなどの基本を再度見直してみてはいかがでしょうか?

投稿2022/01/27 11:34

k08045kk

総合スコア384

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

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

daicheez

2022/01/27 11:57 編集

ご回答ありがとうございます! 動作するようになりました! おっしゃられる通り、グローバル変数やスコープ等をもう一度学び直します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問