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

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

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

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

JavaScript

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

Q&A

1回答

1307閲覧

Rails 同テーブルに一つのページから複数のレコードを作成したい(Javascript)

krppppp

総合スコア13

Ruby on Rails 5

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/24 15:50

目的

スポーツを絡めたアプリを作成中。
そのアプリ内にて試合後一緒にプレイした他の選手に対して評価が出来るシステムを設けたいがユーザーファーストで考えて、form_forもしくはform_tagを使用して評価を行うページは一つにまとめたい。

調べると
一括更新について
一括更新について2

と既に存在するレコードに対してのリファレンスが多くみられた。
他にもajaxを使って非同期にてcreateも考えた
ajax設備
が冗長になる事も考えて別の方法を探索。

今回採用した手法
と、上のリンクを参考にプログラムしてみたが纏まりきらないので皆様のお力を貸して下さい!!

ソースコード

evaluations#new

erb

1 <% n=1 %> 2 <% @evaluated.each do |member|%> 3 <%= form_for @evaluation , html: {id: "form#{n}"} do |f| %> 4 <%= f.hidden_field :game_id, value: @game.id %> 5 <%= f.hidden_field :evaluator_id, value: current_member.id %> 6 <%= f.hidden_field :evaluated_id, value: member.id %> 7 <div class="m-3"> 8 <h3><%= member.name %>さんへの評価</h3> 9 <div class="star"></div> 10 <div class='form-team'> 11 <%= f.text_field :comment, class:'contact-form text-white', placeholder: "コメント" %> 12 </div> 13 </div> 14 <% end %> 15 <% n+=1 %> 16 <% end %> 17 <span id="count" style="display:none;"><%= @evaluated.count%></span> 18 <div class="actions text-center"> 19 <input value="送信する" type="submit" id="send_evaluation" class="btn btn-lightblue text-center"> 20 </div> 21 22</div> 23 24<script> 25$('.star').raty({ 26 size : 36, 27 starOff: '/assets/star-off.png', 28 starOn : '/assets/star-on.png', 29 scoreName: 'evaluation[stars]' 30}); 31var button = document.getElementById('send_evaluation'); 32var n = document.getElementById('count').textContent; 33console.log(n); //デベロッパーツールのデバッグ用 34button.onclick = function(){ 35 for(var i=1; i<n; i++){ 36 console.log(i); //デベロッパーツールのデバッグ用 37 setTimeout(function(){ 38 var f = document.getElementById("form"+ i); 39 console.log(f); //デベロッパーツールのデバッグ用 40 f.submit();}, 300*i); 41 } 42}; 43</script>

evaluation model

def new @evaluation = Evaluation.new @game = Game.find(params[:game_id]) @count = @game.game_members.count-1 others = GameMember.where(game_id: @game, evaluation: false).where.not(member_id: current_member).pluck(:member_id) @evaluated = [] others.each do |m| member = Member.find(m) @evaluated.push(member) end end def create @evaluation = Evaluation.new(evaluation_params) if @evaluation.save redirect_to game_path(evaluation_params[:game_id]), success: "評価が完了しました" else reder "new" end end private def evaluation_params params.require(:evaluation).permit(:game_id, :evaluator_id, :evaluated_id, :stars, :comment) end

retyを使用して☆の数で評価します

###手法

たとえば4人で行うスポーツだったら他三人を評価します。
スポーツ自体大人数でやる競技ではないのですが、今後チーム戦も考えて20人でひとくくりもあり得ます。
アソシエーションの関係で試合テーブルとユーザーテーブルの間にGameMemberテーブルが存在します。

each文で回した分n+1をしていき、それをformのidに指定しております。
javascriptではnの最大値を取得しfor文で同じ数増やしていき、一つ前ののフォームから300*iだけ遅れて送信したいと考えました。

EveerNoteが反応しないのでカメラです。見にくくてすみません

上の様な位置にデバッガーを配置して一つずつ進めると、コンソールにて、setTimeOutのイベントに入る前にfor文が全て実行されていることが判明し、イベントに入ってきた時点でi==2となってしまいます。
for文の条件式も、1ループずつsetTimeOutiイベントに入っていったと仮定して (var=1; i==n;i++) にしたいのですがこちらにした途端送信ボタンが反応しません。
どこが原因なのかご教授お願いしたいです。

また、evaluations#createアクションで@evaluation.saveの場合リダイレクトする処理を条件分岐でおいてますが、複数のレコードを秒差で送信する今回の処理の場合うまく動くのでしょうか。
こちらもご教授下さい。

みなさま宜しくお願いします。

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

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

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

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

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

guest

回答1

0

setTimeout がどういう挙動をするか、非同期処理という観点でもっとよく調べてみるべきです。
sleep とは全く異なるものですので、その用途には向いていませんし、何らかの形で解決したとして、次は f.submit() でページ遷移が発生してしまって思わぬ動きになると思います。
全部のフォームを一括で送るやり方が嫌であれば、非同期通信ももっと具体的に調べて下さい。

投稿2018/05/24 17:30

mather

総合スコア6753

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

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

krppppp

2018/05/29 00:54

結果少し手を加えて解決しました。 折角頂いた唯一の回答でしたが、質問を読んで頂いているのかわからない回答でした。 自己解決へ向けた激を飛ばして頂き有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問