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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1334閲覧

診断アプリ 複数結果の表示について

kwansai724

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/04/18 02:35

編集2021/04/18 14:50

前提・実現したいこと

現在、rails、jqueryで目の動きに関する診断アプリを作成しております。
質問が全部で35問あり、YES・NOですべての質問に回答し、診断ボタンをクリックするとその人の目の動きの苦手な方向が表示されるようにしています。
各質問のYESの回答に対してclass分けをして、7種類(左上、右上、左側、右側、左下、右下、輻輳開散)に分けています。
それぞれ5問ずつあり5×7で35問です。
7種類の質問に対してYESの数が一番多い種類に紐づく結果が表示できるようにしたいと思っています。
また、YESの数が一番多い種類が複数あった場合には、それぞれの結果を同時に表示させたいです。
例えば、左上の質問に対するYESが一番多ければ、「あなたは左上に目を動かすのが苦手です」という結果を表示。
左上と右上のYESが一番多ければ、「あなたは左上に目を動かすのが苦手です」「あなたは右上に目を動かすのが苦手です」と表示。

発生している問題

YESの数が一番多い種類が一つだけの場合の条件分岐は分かるが、YESの数が一番多い種類が複数あった場合の結果の表示のさせ方の条件分岐が分からないです。

該当のソースコード

rails

1<div class="container"> 2 <div id="wrapper"> 3 <div class="question"> 4 <h1 class="title">かんたん診断</h1> 5 <% @diagnoses.each do |diagnosis| %> 6 <ul class="questions"> 7 <li class="textBox"> 8 <span class="text">Q<%= diagnosis.question_number %>.<%= diagnosis.question_content %></span> 9 <div class="btn-group btn-group-toggle" data-toggle="buttons"> 10 <%= form_with(local: true) do |f| %> 11 <label class="btn btn-secondary"> 12 <%= f.radio_button :question, :yes, class: "#{diagnosis.question_type}" %>YES 13 </label> 14 <label class="btn btn-secondary"> 15 <%= f.radio_button :question, :no %>NO 16 </label> 17 <% end %> 18 </div> 19 </li> 20 </ul> 21 <% end %> 22 <button>診断する</button> 23 </div> 24 <% @diagnosis_results.each do |result| %> 25 <div class="result <%= result.result_type %>(結果)"> 26 <div class="Result_recommend">あなたもしかしたら、こんな目かも</div> 27 <div class="Result_menu"> 28 <div class="Result_menu_text">【<%= result_status(result) %>】</div> 29 </div> 30 <div class="Result_recommend"> 31 <p><%= result_status(result) %>な方は・・・</p> 32 </div> 33 <div class="result-text"> 34 <p><%= result.result_text %></p> 35 </div> 36 <div class="image"> 37 <td><%= image_tag(result.result_picture.url, width: "300px") if result.result_picture? %> 38 </div> 39 </div> 40 <% end %> 41 <div class="results"> 42 <div class="results-text"> 43 <p>目は脳の一部であり、感覚神経や運動神経とつながっています。トレーニングを行う事で、今まで抱えていた悩みを解決できるかもしれません!</p> 44 </div> 45 <div class="result-btn"> 46 <%= link_to "「眼トレ・メントレ・脳トレ」に興味を持った方はこちら!", "#", class: "btn btn-result" %> 47 </div> 48 </div> 49 </div> 50</div> 51 52<script src="index.js"></script>

jquery

1$(function(){ 2 //一度結果を非表示にする 3 $(".result, .results").hide(); 4 //ボタンがクリックされた時 5 $("button").on("click", function(){ 6 //一度結果を非表示にする 7 $(".result, .results").hide(); 8 //問題数を取得 9 var qNum = $("ul.questions li").length; 10 if( $("ul.questions li input:checked").length < qNum ){ 11 //全てチェックしていなかったらアラートを出す 12 alert("未回答の質問があります"); 13 } 14 else { 15 //チェックされているinputの数を取得 16 var typeANum = $(".左上:checked").length, 17 typeBNum = $(".右上:checked").length, 18 typeCNum = $(".左側:checked").length, 19 typeDNum = $(".右側:checked").length, 20 typeENum = $(".左下:checked").length, 21 typeFNum = $(".右下:checked").length, 22 typeGNum = $(".輻輳開散:checked").length; 23 if( typeANum > typeBNum && typeANum > typeCNum && typeANum > typeDNum && typeANum > typeENum && typeANum > typeFNum && typeANum > typeGNum) { 24 $(".左上(結果),.results").fadeIn(); 25 } else if( typeBNum > typeANum && typeBNum > typeCNum && typeBNum > typeDNum && typeBNum > typeENum && typeBNum > typeFNum && typeBNum > typeGNum) { 26 $(".右上(結果),.results").fadeIn(); 27 } else if( typeCNum > typeANum && typeCNum > typeBNum && typeCNum > typeDNum && typeCNum > typeENum && typeCNum > typeFNum && typeCNum > typeGNum) { 28 $(".左側(結果),.results").fadeIn(); 29 } else if( typeDNum > typeANum && typeDNum > typeBNum && typeDNum > typeCNum && typeDNum > typeENum && typeDNum > typeFNum && typeDNum > typeGNum) { 30 $(".右側(結果),.results").fadeIn(); 31 } else if( typeENum > typeANum && typeENum > typeBNum && typeENum > typeCNum && typeENum > typeDNum && typeENum > typeFNum && typeENum > typeGNum) { 32 $(".左下(結果),.results").fadeIn(); 33 } else if( typeFNum > typeANum && typeFNum > typeBNum && typeFNum > typeCNum && typeFNum > typeDNum && typeFNum > typeENum && typeFNum > typeGNum) { 34 $(".右下(結果),.results").fadeIn(); 35 } else if( typeGNum > typeANum && typeGNum > typeBNum && typeGNum > typeCNum && typeGNum > typeDNum && typeGNum > typeENum && typeGNum > typeFNum) { 36 $(".輻輳開散(結果),.results").fadeIn(); 37 } 38 } 39 }); 40});

試したこと

var a = [typeANum, typeBNum, typeCNum, typeDNum, typeENum, typeFNum, typeGNum];
var max = Math.max.apply(null, a);
と書いて、最大値を取得してそれと同じ数のtypeを絞り込み、そのtypeに紐づく結果を表示させられるかとも考えましたが、これ以降の記述の仕方が思いつきませんでした。

「診断アプリ 複数結果」などで調べてみましたが、今のところ参考になるものが見つかっておりません。

どなたかアドバイス頂けると幸いです。
よろしくお願いいたします。

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

ruby 2.6.6
rails (5.2.4.5)
jquery-rails (4.4.0)

追記(2021/04/18)

下記の様に、コードを修正しました。

jquery

1 2$(function(){ 3 //一度結果を非表示にする 4 $(".result, .results").hide(); 5 //ボタンがクリックされた時 6 $("button").on("click", function(){ 7 //一度結果を非表示にする 8 $(".result, .results").hide(); 9 //問題数を取得 10 var qNum = $("ul.questions li").length; 11 if( $("ul.questions li input:checked").length < qNum ){ 12 //全てチェックしていなかったらアラートを出す 13 alert("未回答の質問があります"); 14 } 15 else { 16 //チェックされているinputの数を取得 17 var typeANum = $(".左上:checked").length, 18 typeBNum = $(".右上:checked").length, 19 typeCNum = $(".左側:checked").length, 20 typeDNum = $(".右側:checked").length, 21 typeENum = $(".左下:checked").length, 22 typeFNum = $(".右下:checked").length, 23 typeGNum = $(".輻輳開散:checked").length; 24 var a = [typeANum, typeBNum, typeCNum, typeDNum, typeENum, typeFNum, typeGNum]; 25 var max = Math.max.apply(null, a); 26 var eyes = [ 27 { type: "A", Num: typeANum, result: ".左上(結果)" }, 28 { type: "B", Num: typeBNum, result: ".右上(結果)" }, 29 { type: "C", Num: typeCNum, result: ".左側(結果)" }, 30 { type: "D", Num: typeDNum, result: ".右側(結果)" }, 31 { type: "E", Num: typeENum, result: ".左下(結果)" }, 32 { type: "F", Num: typeFNum, result: ".右下(結果)" }, 33 { type: "G", Num: typeGNum, result: ".輻輳開散(結果)" }, 34 ]; 35 36 var filtered = $.grep(eyes, 37 function(element, index) { 38 39 return (element.Num >= max); 40 } 41 ); 42 43 console.log(filtered); 44 var r = $("filtered").val("result"); 45 $("r,.results").fadeIn(); 46 } 47 }); 48});

最大値を取得し、オブジェクトも作成してtypeとresultが紐づくようにしました。
そして最大値とオブジェクトのNumが同数のものを抽出するようにして、YESが一番多いオブジェクトの抽出までは出来ました。(写真はtypeAのYESが一番多かった時のconsole.log(filtered);の結果です)

イメージ説明

抽出できた結果の中から、resultの内容を取得できればと思い、
var r = $("filtered").val("result");
という書き方をしましたが、取得ができていないのが現状です。
オブジェクトの中の特定の要素のみを取り出す方法が分かればと思うのですが、どなたかアドバイス頂けたらと思います。
よろしくお願いいたします。

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

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

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

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

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

satokei

2021/04/18 09:19

最大値を利用する方法なら、 最大値とそれぞれの数が一致するかを判定に利用するのはどうでしょうか。
kwansai724

2021/04/18 12:38 編集

gouf様 ご返信ありがとうございます! 初心者のためsortというのを初めて知りました。 教えて頂いた参考サイトを見て試してみます。
kwansai724

2021/04/18 12:49

satokei様 ご返信ありがとうございます! 判定して抽出したtypeと表示させたい結果を結びつけるところが難しいと感じております、、。 現状だと、typeAが一番多くYESがあった場合は、 $(".左上(結果),.results").fadeIn();という風に書いているため、typeの数が複数になると色んなパターンを書かなければならず、現実的ではないかなと思い、行き詰ってます。。
guest

回答1

0

ベストアンサー

var r = $("filtered").val("result");
という書き方をしましたが、取得ができていないのが現状です。

変数filteredを文字列として扱ってしまっています。

以下のようにすればよいかと思います。

js

1console.log(filtered); 2 3let selector = filtered.map(e => e.result).join(','); 4$(`${selector},.results`).fadeIn()

投稿2021/04/18 16:35

satokei

総合スコア1217

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

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

kwansai724

2021/04/18 22:49

satokei様 ご回答いただいた書き方で無事欲しい結果が出ました! 本当にありがとうございます。 大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問