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

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

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

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

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

672閲覧

Ralis上で、JavaScriptを使いブラウザ経由で取得した音声を、Ajaxを利用しての送信・保存ができません

take-miya

総合スコア15

Ruby on Rails

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

JavaScript

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2018/10/17 03:39

編集2018/10/17 03:49

前提・実現したいこと

Ruby on Railsを利用してSNSを作成しており、実現したい機能として、各投稿にブラウザ上から録音した音声を投稿したいです。
その録音した音声を、ajaxを用いて、posts_controllerに渡し、Railsの/public/audio配下に保存しようとしています。

その投稿の保存ができずに困っています。

  • 音声の録音はjavascriptのWebAudioApiを用いています。
  • またテスト段階でローカル上で動かしているため、CSRFは以下の通りに設定しています

発生している問題・エラーメッセージ

[chromeデベロッパーツールでのエラー] POST http://localhost:3000/posts/create 500 (Internal Server Error) [Railsコンソールでのエラー] NoMethodError (undefined method `read' for nil:NilClass): app/controllers/posts_controller.rb:37:in `create'

該当のソースコード

javasctip

1 2/* 省略 */ 3 4audio.controls = true; 5var blob = new Blob(chunks, { 'type' : 'audio/ogg' }); 6 7/* 省略 */ 8 9var fd = new FormData(); 10fd.append('name', "test"); 11fd.append("test.ogg", blob); 12console.log(fd); 13 14//CSRFtokenをヘッダーに付与 15$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 16 var token; 17 if (!options.crossDomain) { 18 token = $('meta[name="csrf-token"]').attr('content'); 19 if (token) { 20 return jqXHR.setRequestHeader('X-CSRF-Token', token); 21 } 22 } 23 }); 24 25$.ajax({ 26 url: 'http://localhost:3000/posts/create', 27 type: "POST", 28 // dataType: 'blob', 29 data: {audio: fd}, 30 processData: false, 31 contentType: false 32 }) 33 .done(function(data){ 34 console.log(data); 35 }) 36 .fail(function(data){ 37 console.log("送信に失敗しました"); 38 }); 39 }

Rails

1 2# Ajaxでの通信を可能にするために、:null_sessionで設定 3[application/controllre.rb] 4class ApplicationController < ActionController::Base 5 # Prevent CSRF attacks by raising an exception. 6 # For APIs, you may want to use :null_session instead. 7 protect_from_forgery with: :null_session 8 9[posts/controller.rb] 10 def create 11 audio = params[:audio] 12 File.binwrite("public/user_audio/sample.ogg", audio.read) 13 end 14

試したこと

[posts/controller.rb]の createメソッド上でbinding.pryを実行し、"audio = params[:audio]" の中身を確認したところ、" nill " と返ってきており、" audio = params[:audio] " にデータが渡されていない。
そのために、" NoMethodError (undefined method `read' for nil:NilClass): " が呼ばれていると考えています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

fd.append("test.ogg", blob);と渡していますが、このキーをtest.oggではなくaudioに変えてみたら、どうなりますでしょうか。

投稿2018/10/17 04:00

maisumakun

総合スコア145183

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

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

take-miya

2018/10/17 08:03 編集

回答いただいた通り、キーを "audio" に変更したところ、解決しました!! ありがとうございました。 ただ Chrome コンソール上の エラー ---------------------------------------- jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js?body=1:10255 POST http://localhost:3000/posts/create 500 (Internal Server Error) ---------------------------------------- は表示されたままです。 録音はできたので、ほしい機能はつけられたのですが、少し気持ち悪くあります。 もし上記のエラーに関して何かしら情報をいただけましたら幸いです。 追加の依頼で恐縮ですが、お手すきのさいにお願いします。 Chromeのエラーリンクをクリックすると、下記がハイライトされます。 ---------------------------------------- // Do send the request // This may raise an exception which is actually // handled in jQuery.ajax (so no try/catch here) xhr.send( ( options.hasContent && options.data ) || null ); ----------------------------------------
maisumakun

2018/10/17 08:04

createアクション内で何もrenderしていない結果、ビューを探しだしてしまう(そして、見つからない)ためにエラーとなるものと思われます。 たとえばcreateの末尾に「head :no_content」と書いて「204 No Content」だけ返すようにするなど、リクエストに対して返すものを定義しておきましょう。
take-miya

2018/10/17 08:10

こちらの回答も早速返信いただきありがとうございます。"head :no_content" を記述したところ、該当のエラーはなくなりました。 丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問