🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

2回答

736閲覧

RailsでAPI受信契機で画面遷移させたい

toshir32

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/19 01:24

編集2020/12/19 23:02

【実現したいこと】
・マイコンボードから送信された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 %>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/21 02:18

これって画面表示はブラウザですか?
toshir32

2020/12/21 04:02

はい。そうです。 (ただお客様の指定でIE11です)
guest

回答2

0

websocketを使う必要があると思います。
もしくはajaxでポーリングするか
参考
https://qiita.com/h_tyokinuhata/items/809bdb66f8da6dd53bb6

投稿2020/12/21 04:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

自己解決

最終的に以下の方法で解決しました
・Controller内、Rubyでhttp GETリクエストをデバイス側に送る(別スレッド)
・GETのレスポンスが成功/失敗か判定する
・成功の場合、インスタンス変数で値を保持し、WIN32OLEでieを制御して次画面(showアクションでid違い)に遷移

投稿2020/12/23 00:58

toshir32

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問