質問するログイン新規登録

質問編集履歴

2

コードの追記

2019/11/14 05:38

投稿

nanase21
nanase21

スコア144

title CHANGED
File without changes
body CHANGED
@@ -110,4 +110,14 @@
110
110
  params.require(:message).permit(:dm).merge(user_info: current_user)
111
111
  end
112
112
  end
113
+ ```
114
+
115
+
116
+ 更新をバックエンドで待ち続ける時
117
+ ```ruby
118
+ #dmは取得したレコード
119
+ loop do
120
+ break if dm.present?
121
+ sleep 0.1
122
+ end
113
123
  ```

1

コードの追記

2019/11/14 05:38

投稿

nanase21
nanase21

スコア144

title CHANGED
File without changes
body CHANGED
@@ -59,4 +59,55 @@
59
59
  # 困っていること
60
60
  ショートポーリングの実装は、ajaxを定期的に呼び出すことで簡単に実装することができたのですが、ロングポーリングにいては、何をどうしたらよいかが分からない状態でいます。
61
61
  特にバックエンド側の、メッセージを受け取るまで閉じずに待つという処理が分からないです。(概念は理解できているのですがコードの書き方が分からないです。)
62
- そのため、バックエンド側のコードを交えてご教示いただけると幸いです。
62
+ そのため、バックエンド側のコードを交えてご教示いただけると幸いです。
63
+
64
+
65
+ **試したこと**
66
+ 動かないですが、私の中でイメージしているロングポーリングの処理です。
67
+
68
+ ```ruby
69
+ class DmController < ApplicationController
70
+
71
+ def ajax
72
+ # {message {cnt:9}} パラメーターです。cntはviewに表示されているメッセージの数です。
73
+ # 例)DBにはメッセージが10こあるとします。
74
+ dm = Dm.all
75
+ num = dm.count - params[:message][:cnt].to_i
76
+ # => 1
77
+ dm.last(num)
78
+ respond_to do |format|
79
+ if dm.present?
80
+ format.js
81
+ format.json { render json: dm }
82
+ else
83
+ wait
84
+ end
85
+ end
86
+ end
87
+
88
+ def wait dm = nil
89
+ sleep(60) if dm.blank? # sleepをkillしてjsonを返す
90
+ respond_to do |format|
91
+ format.js
92
+ format.json { render json: dm }
93
+ end
94
+ end
95
+
96
+ def create
97
+ dm = Dm.new(params)
98
+ respond_to do |format|
99
+ if dm.save
100
+ wait(dm)
101
+ else
102
+ redirect_to root_path
103
+ end
104
+ end
105
+ end
106
+
107
+ private
108
+
109
+ def params
110
+ params.require(:message).permit(:dm).merge(user_info: current_user)
111
+ end
112
+ end
113
+ ```