前提・実現したいこと
Userモデル(ユーザー)、Gameモデル(試合)に紐付いたEvaluationモデル(試合に関しての相手もしくは仲間ユーザーの評価)を生成する際に、以下のコードにて他Userを星5つから、星いくつにするかを選択と、一行ほどのコメントで評価できる機能を実装しました。
しかし、iOsでのみ予期しない動きが出ているのでそちらの原因、解決策を教えていただきたいです。
発生している問題・エラー
リダイレクト先を設置していなのにフォーム送信完了後に謎のページに飛んでしまう。
↓画像のurl: www."ドメイン名"/evaluations
該当のソースコード
ruby
1 2#evaluations_controller 3 4 def new 5 @evaluation = Evaluation.new 6 @game = Game.find(params[:game_id]) 7 others = GameMember.where(game_id: @game).where.not(member_id: current_member).pluck(:member_id) 8 9 @evaluated = [] 10 others.each do |m| 11 member = Member.find(m) 12 @evaluated.push(member) 13 end 14 @count = @evaluated.count #自分以外他の試合関係者 15 16 end 17 18 def create 19 @evaluation = Evaluation.new(evaluation_params) 20 @evaluation.save 21 # redirect_to game_path(evaluation_params[:game_id]), 22 # else 23 # reder "new" 24 # end 25 #こちらのコメントアウトはもともとあったもの 26 end
ruby
1 2<!--evaluations#new.html.erb--> 3<div class="container"> 4 <div class="text5 text-center">評価ページ</div> 5 <% n=1 %> 6 <% @evaluated.each do |member|%> 7 <%= form_for @evaluation , html: {id: "form#{n}"} do |f| %> 8 <%= f.hidden_field :game_id, value: @game.id %> 9 <%= f.hidden_field :evaluator_id, value: current_member.id %> 10 <%= f.hidden_field :evaluated_id, value: member.id %> 11 <div class="card my-2"> 12 <div class="m-3"> 13 <h3><%= member.name %>さんへの評価</h3> 14 <div class="star mt-2 mb-2"></div> 15 <div class='form-team'> 16 <%= f.text_field :comment, class:'contact-form text-white', placeholder: "コメント" %> 17 </div> 18 </div> 19 </div> 20 <% end %> 21 <% n+=1 %> 22 <% end %> 23 <span id="count" style="display:none;"><%= @evaluated.count%></span> 24 <div class="actions text-center mt-5"> 25 <input value="送信する" type="submit" id="send_evaluation" class="btn btn-lightblue"> 26 <input value="戻る" type="button" style="display:none;" id="back-button" class="btn btn-lightblue mb-3"> 27 </div> 28</div> 29 30<script> 31$('.star').raty({ 32 size : 36, 33 starOff: '/assets/star-off.png', 34 starOn : '/assets/star-on.png', 35 scoreName: 'evaluation[stars]', 36 score: 5 37}); 38 39var button = document.getElementById('send_evaluation'); 40var button2 = document.getElementById('back-button'); 41var n = document.getElementById('count').textContent; 42button.onclick = function(){ 43 if(confirm("評価、コメントに間違いはありませんか?")){ 44 this.style.display = "none"; 45 button2.style.display ="inline"; 46 for(var i=1; i<=n; i++){ 47 (function(param) { 48 setTimeout(function(){ 49 var form = document.getElementById("form"+ param); 50 form.submit();}, 300*param); 51 })(i); 52 }; 53 } 54}; 55 56button2.onclick = function(){ 57 var url = location.pathname.split('/'); 58 location.href = "https://ドメイン名/games/" + url[3];#このページのリンク元 59 return false; 60}; 61</script> 62
解説
一度に何人も同時に評価を送りたいので人数分フォームを繰り返し300ミリ秒ごとにcreateアクションに送信しています。アクション内ではリダイレクトをしないようにしてSaveのみでとどめました。
Android,PCでは問題なくレコードが生成され、送信ボタンは戻るボタンにかわり、それをクリックすることで指定したURLにJavascript側でリダイレクトを起こします。
しかしiOSのみ、そのページにとどまることをせず上に載せた謎のページにとんでします。
レコードは無事生成されているとは言え、ユーザー側視点から見るとエラーの何者でもないのでどうにかこれを回避したいです。
試したこと
javascript
1 2//送信ボタン 3button.onclick = function(){ 4 if(confirm("評価、コメントに間違いはありませんか?")){ 5 for(var i=1; i<=n; i++){ 6 (function(param) { 7 setTimeout(function(){ 8 var form = document.getElementById("form"+ param); 9 form.submit();}, 300*param); 10 })(i); 11 }; 12 var url = location.pathname.split('/'); 13 location.href = "https://ドメイン名/games/" + url[3];#このページのリンク元 14 return false; 15 } 16}; 17
最初はボタンも2つは必要とせずフォーム送信後に勝手に指定したURLに戻る仕様にしたかったです(当然ですが)。
location.hrefの他にもreplace や assign や history.go(−1) などで代役しました。
しかし上記のように組んだところどれもページ遷移は起こすのですが肝心のフォームが送信されず、結果ページ遷移するだけの機能になってしまった為、ソースコードに記載したように
1,フォームを送信する機能(同時に戻るボタンへ切り替え)
2,戻るボタンをクリックでページ遷移
の機能2つに分けていました。
ところがその2つの機能に分けたところで,1つ目の機能の終わりに謎のページ遷移を起こしてしまうので私の対応力では限界になってしまいました。
解決策
1,2つの機能を一緒くたにして、更にしっかりフォーム送信ができる
または
2、2つに分けたまま、iOSのなぞのページ遷移を起こさせないようにする
のどちらかでもよろしいのでアドバイスをいただけましたら幸いです。
よろしくおねがいします。
あなたの回答
tips
プレビュー