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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1540閲覧

Railsのhelperメソッドが意図しないときに呼ばれる

ShionHonda

総合スコア11

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2017/03/22 16:18

Ruby on RailsとJavaScriptで4択クイズアプリを作っています。
問題画面で選択肢ボタンをクリックするとhelperのメソッドによりデータベースが更新され、画面遷移なしで正解/不正解が表示されます。ここでグラフ表示ボタンを押すと、画面が遷移してグラフ表示画面に飛ぶようにしました。

しかし、グラフ表示ボタンを押したときにもこのhelperメソッドupdateData(bool)が呼び出されているようで、勝手にデータベースが更新され、解答済みの問題数が1だけ余分に増えてしまいます。console.logの結果を見たところ、グラフ表示ボタンでsendAnswer(ans)が呼び出されているわけではないようです。

原因やデバッグのヒントなど、アドバイスを頂けると幸いです。
Railsはversion 5.0.1を使っています。
よろしくお願いいたします。

html

1<head> 2 <script> 3 function sendAnswer(ans){ 4 var questionID = getNumber(); 5 var data = readCSV(questionID); 6 //選択肢番号と正解番号data[5]と等しければ正解 7 if(data[5] == ans ){ 8 console.log("true") 9 <% updateData(1) %> 10 }else{ 11 console.log("false") 12 <% updateData(0) %> 13 }; 14 //解答後にグラフ表示ボタンを表示 15 $("#bottom").append('<div id="showChart"></div>'); 16 $("#showChart").html('<button id="showChartBtn" onclick="showChart()">グラフ表示</button>'); 17 }; 18 </script> 19 20 <script> 21 function showChart(){ 22 window.location.href = "/chart"; 23 }; 24 </script> 25</head> 26 27<body> 28 <% alphabets = ["A", "B", "C", "D"] %> 29 <!-- forループでA-Dの選択肢を表示 --> 30 <% for i in 0..3 %> 31 <button class="choice_btn" id="btn_<%= i %>" onclick="sendAnswer(<%= i %>);"> 32 <%= alphabets[i] %> 33 </button> 34 <% end %> 35 <div id="bottom"> 36 <!-- ここにグラフ表示ボタンが入る --> 37 </div> 38</body>

ruby

1# 記憶トークンcookieに対応するユーザーを返す 2 def current_user 3 if (user_id = session[:user_id]) 4 @current_user ||= User.find_by(id: user_id) 5 elsif (user_id = cookies.signed[:user_id]) 6 user = User.find_by(id: user_id) 7 if user && user.authenticated?(:remember, cookies[:remember_token]) 8 log_in user 9 @current_user = user 10 end 11 end 12 end 13 14#データベース更新。問題数を1増やし、正解ならば正解数を1増やす 15def updateData(bool) 16 current_user.questionNum += 1 17 current_user.correctNum += bool 18 current_user.save 19end

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

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

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

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

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

guest

回答1

0

ベストアンサー

この <% updateData(1) %> は Rails(erb) の テンプレートタグ だと思われます。

つまりこのupdateData は サーバサイドで処理されているので、buttonを押した時のJavascriptの処理には関係ないです。簡単に流れを説明します。

1. ブラウザでページにアクセス 2. サーバアプリ(Rails)がHTML生成する 3. この時 <% %> で囲まれた部分のテンプレートが処理される。 4. 生成されたHTMLがブラウザに返される 5. ブラウザで画面が確認できて、ボタンを押してJSを実行できる

<% updateData(1) %><% updateData(0) %> は 3のタイミングで有無も言わさず実行されて、その結果DBが更新されてしまったのだと思います。

実際に画面を開いて、右クリックで「ページのソースを表示」などをして見てください。<% updateData(1) %> が書いてあった位置は空白(空行)になってると思います。

投稿2017/03/22 17:16

編集2017/03/22 17:18
tell_k

総合スコア2120

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

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

ShionHonda

2017/03/22 17:36

埋め込みRubyは、HTML生成の際に実行されるのですね! 選択肢ボタンのクリックイベントでControllerのActionを呼んで、Action経由でhelperメソッドを実行すればうまくいくのかな、と方針が立ちました。 深夜にもかかわらず迅速なご回答、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問