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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

0回答

1296閲覧

(Rails・Vue.js)SPAで画面遷移後のページにデータを渡す方法が分かりません

hasaya

総合スコア4

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

1クリップ

投稿2021/07/06 05:17

編集2021/07/07 00:47

前提・実現したいこと

Ruby on rails 6 にVue.jsを導入し、音声録音を用いたサイトを作成しております。SPAでトップページで完結させたいと考えているのですが、実装方法が分からず恐れ入りますがご教示いただければ幸いです。コントローラー側でcreateアクションで受け取ったWeb Apiのレスポンスをtopアクションに渡すの処理が分からない状況です。

下記が実装したい流れです。(③が分からない状況です)
①トップページでWeb Audio APIを用いて音声を録音
②音声データをrailsのコントローラーに渡し、コントローラー内でWeb Apiに音声データをとともにリクエストを投げてレスポンスを受け取る。
③画面書き換え後のトップページにレスポンスを渡して結果表示

該当のソースコード

#static/pages/top.html mounted() {   // マイクにアクセス   navigator.mediaDevices.getUserMedia({ audio: true })     .then(stream => {       let audioBlob;       this.recorder = new MediaRecorder(stream);       this.recorder.addEventListener('dataavailable', e => {          this.audioData.push(e.data);          this.audioExtension = this.getExtension(e.data.type);       });       //ボタンを押した際に音声録音を開始し、音声データをRailsのコントローラー(createアクション)に音声データ渡す       this.recorder.addEventListener('stop', () => {           audioBlob = new Blob(this.audioData);           console.log(audioBlob);           formData = new FormData();           formData.append("audio", audioBlob);           console.log(formData);           $.ajax({               url: '/static_pages', //createアクションに渡す               type: 'POST',               contentType: false,               processData: false,               data: formData           }); this.status = 'finishRecording'; }); //ボタンを押して画面書き換えをし、コントローラーで処理されたレスポンスを取得する document.getElementById("btn").addEventListener('click', () => { const result = gon.result;
#static_pages_controller.rb   #createアクションのレスポンスを受け取りトップページへ(gem gonを使用し、Javascriptに渡す) def top gon.result = @result end #トップページから受け取った音声データを元にWeb Apiにリクエストを投げてレスポンス取得 def create  @audio = params[:audio] require 'uri' require 'net/http' require 'openssl' url = URI(Settings.speaker_identification.url) http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Content-Type"] = 'audio/x-pcm;bit=16;rate=16000;channels=1' request["Ocp-Apim-Subscription-Key"] = Settings.speaker_identification.subscription_key file = File.read(@audio) request.body = file response = http.request(request) @result = response.read_body end

試したこと

ソースコードのControllerのように現在は実装していますが、これだと上手くデータを渡せずgon.result=nullになってしまいます。createアクションでrender "top"やredirect_to top_pathを試しましたがやはり上手くいきません。コールバック(after actionなど?)を使えば上手くいくのかとも思ったのですが、どうも違うような気がしました。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問