【実現したいこと】
・マイコンボードから送信されたJSONをAPIで受信し、Viewで結果を表示する。
・受信したJSONの情報はすぐにDBに保存しない。一旦画面に表示させたあとに保存ボタンを押下でDBに保存する。
・画面に表示させるまでの時間、ローディング画面を出す(現状GIFアニメを表示させViewで対応)。
・JSON受信を契機に、ローディング→結果表示画面に遷移したい。
【現状】
・JSONで受信する項目毎にグローバル変数を用意し、予めnilで初期化しておく。
・APIで受信したJSONをParseし、結果をグローバル変数に入れる。
・Controllerでグローバル変数がnilでないか1秒おきにチェックしている。
・グローバル変数がnilでない場合、画面を遷移させようと考えている。
・別スレッドでチェック処理を起動しているがうまくいかない(DoubleRenderErrorに悩まされている)
【ご質問】
・そもそもこの方法以外にAPI受信を契機に、画面遷移させる方法はありますでしょうか?
グローバル変数を使って値を定期的にチェックする処理も、良くない処理ではないかと思います。
(安易にグローバル変数を使うことに抵抗がありつつ方策が無いため使っています)
現状のControllerのコードは以下の通りです。
def show @id = params[:id] if @id == '2' render 'err.html.erb' end th = Thread.new do →別スレッドでグローバル変数をチェック while true do if $temp != nil; th.kill ←ここでrender,redirectで次画面として用意したViewに遷移させようと思うがうまくいかない break end sleep(1) puts 'check' end end puts 'checked' # 取得した値をインスタンス変数に格納(Viewで表示するため) @temp = $temp @id = params[:id] if @id == '3' render :layout => 'vital' end end
View(erb)に以下のコードを記載することで、チェック部分は動くようになりました。
しかし、redirect_toの部分が動かないようです。
JSか、何らかの方法で遷移させれば解決できそうですが、お知恵を拝借したいです。
undefined method `redirect_to' for #<#Class:0x0000000009c085d8:0x000000000b570fc0> (NoMethodError)
<% th = Thread.new do %> <% while true do %> <% if $temp != nil; %> <% redirect_to 'http://localhost:3000/checks/3' %> <% th.kill %> <% end %> <% sleep(1) %> <% puts 'check' %> <% end %> <% end %>
回答2件
あなたの回答
tips
プレビュー