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

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

ただいまの
回答率

90.34%

  • Ruby on Rails

    7667questions

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

Rails 1つのフォームで複数のレコード生成したあとの挙動

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 120

krppppp

score 4

 前提・実現したいこと

Userモデル(ユーザー)、Gameモデル(試合)に紐付いたEvaluationモデル(試合に関しての相手もしくは仲間ユーザーの評価)を生成する際に、以下のコードにて他Userを星5つから、星いくつにするかを選択と、一行ほどのコメントで評価できる機能を実装しました。
しかし、iOsでのみ予期しない動きが出ているのでそちらの原因、解決策を教えていただきたいです。

 発生している問題・エラー

リダイレクト先を設置していなのにフォーム送信完了後に謎のページに飛んでしまう。

↓画像のurl: www."ドメイン名"/evaluations

イメージ説明

 該当のソースコード

#evaluations_controller

  def new
    @evaluation = Evaluation.new
    @game = Game.find(params[:game_id])
    others = GameMember.where(game_id: @game).where.not(member_id: current_member).pluck(:member_id)

     @evaluated = []
     others.each do |m|
      member  = Member.find(m)
      @evaluated.push(member)
    end
   @count = @evaluated.count #自分以外他の試合関係者

  end

  def create
    @evaluation = Evaluation.new(evaluation_params)
    @evaluation.save
   #   redirect_to game_path(evaluation_params[:game_id]), 
   # else
   #   reder "new"
   # end 
   #こちらのコメントアウトはもともとあったもの
  end
<!--evaluations#new.html.erb-->
<div class="container">
  <div class="text5 text-center">評価ページ</div>
  <% n=1 %>
  <% @evaluated.each do |member|%>
    <%= form_for @evaluation , html: {id: "form#{n}"} do |f| %>
      <%= f.hidden_field :game_id, value: @game.id %>
      <%= f.hidden_field :evaluator_id, value: current_member.id %>
      <%= f.hidden_field :evaluated_id, value: member.id %>
      <div class="card my-2">
      <div class="m-3">
        <h3><%= member.name %>さんへの評価</h3>
        <div class="star mt-2 mb-2"></div>
        <div class='form-team'>
          <%= f.text_field :comment, class:'contact-form text-white', placeholder: "コメント" %>
        </div>
      </div>
      </div>
    <% end %>
    <% n+=1 %>
  <% end %>
  <span id="count" style="display:none;"><%= @evaluated.count%></span>
  <div class="actions text-center mt-5">
    <input value="送信する" type="submit" id="send_evaluation" class="btn btn-lightblue">
    <input value="戻る" type="button" style="display:none;" id="back-button" class="btn btn-lightblue mb-3">
  </div>
</div>

<script>
$('.star').raty({
  size     : 36,
  starOff: '/assets/star-off.png',
  starOn : '/assets/star-on.png',
  scoreName: 'evaluation[stars]',
  score: 5
});

var button = document.getElementById('send_evaluation');
var button2 = document.getElementById('back-button');
var n = document.getElementById('count').textContent;
button.onclick = function(){ 
  if(confirm("評価、コメントに間違いはありませんか?")){
    this.style.display = "none";
    button2.style.display ="inline";
    for(var i=1; i<=n; i++){
      (function(param) {
        setTimeout(function(){
          var form = document.getElementById("form"+ param);
          form.submit();}, 300*param);
      })(i);
    };
  }
};

button2.onclick = function(){
  var url = location.pathname.split('/');
  location.href = "https://ドメイン名/games/" + url[3];#このページのリンク元
  return false;
};
</script>

 解説

一度に何人も同時に評価を送りたいので人数分フォームを繰り返し300ミリ秒ごとにcreateアクションに送信しています。アクション内ではリダイレクトをしないようにしてSaveのみでとどめました。

Android,PCでは問題なくレコードが生成され、送信ボタンは戻るボタンにかわり、それをクリックすることで指定したURLにJavascript側でリダイレクトを起こします。
しかしiOSのみ、そのページにとどまることをせず上に載せた謎のページにとんでします。
レコードは無事生成されているとは言え、ユーザー側視点から見るとエラーの何者でもないのでどうにかこれを回避したいです。

 試したこと

//送信ボタン
button.onclick = function(){ 
  if(confirm("評価、コメントに間違いはありませんか?")){
    for(var i=1; i<=n; i++){
      (function(param) {
        setTimeout(function(){
          var form = document.getElementById("form"+ param);
          form.submit();}, 300*param);
      })(i);
    };
  var url = location.pathname.split('/');
  location.href = "https://ドメイン名/games/" + url[3];#このページのリンク元
  return false;
  }
};

最初はボタンも2つは必要とせずフォーム送信後に勝手に指定したURLに戻る仕様にしたかったです(当然ですが)。
location.hrefの他にもreplace  や assign や history.go(−1) などで代役しました。
しかし上記のように組んだところどれもページ遷移は起こすのですが肝心のフォームが送信されず、結果ページ遷移するだけの機能になってしまった為、ソースコードに記載したように
1,フォームを送信する機能(同時に戻るボタンへ切り替え)
2,戻るボタンをクリックでページ遷移
の機能2つに分けていました。

ところがその2つの機能に分けたところで,1つ目の機能の終わりに謎のページ遷移を起こしてしまうので私の対応力では限界になってしまいました。

 解決策

1,2つの機能を一緒くたにして、更にしっかりフォーム送信ができる

または

2、2つに分けたまま、iOSのなぞのページ遷移を起こさせないようにする

のどちらかでもよろしいのでアドバイスをいただけましたら幸いです。
よろしくおねがいします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Ruby on Rails

    7667questions

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