前提・実現したいこと
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): " が呼ばれていると考えています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/17 08:03 編集
2018/10/17 08:04
2018/10/17 08:10