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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

4211閲覧

Ruby on Rails でのデータベースに登録した音声ファイル(バイナリデータ)の表示方法

YasutakaKonishi

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

2クリップ

投稿2016/07/07 09:32

編集2016/07/08 02:49

Ruby on Rails において、データベースに登録した音声ファイル(バイナリデータ)の呼び出し方について質問です。

現在、データベースに音声ファイルを登録するところまではできるのですが、ビューファイルで、audio_tagを用いてプレーヤー形式で表示することができません。

controllerで、パスを取得するためのメソッドを定義のうえ、routesでアクションを定義、その後、ビューファイルで、<audio_tag (パス, :controls) %>と記述しているのですが、表示することができません。どのように記述すればよいか、ご教示頂けますと幸いです。

追記:コードは以下です!

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
[comic.rb]

class Comic < ActiveRecord::Base
has_many :pages
has_many :sounds
end
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

[sound.rb]
class Comic < ActiveRecord::Base
has_many :pages
has_many :sounds
end
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

[controller]

sound_forで、データベースのデータを送るよう定義。

class ComicsController < ApplicationController

def index
@comic = Comic.all
end

def show
@comic = Comic.find(params[:id])
@pages= Comic.find(params[:id]).pages
@s

end

def sound_for
@sound= Comic.find(params[:id]).sounds
send_data(@sound.upload_file)
end

end

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

[route]

Rails.application.routes.draw do
devise_for :users
resources :users
resources :comics, only: :show do
resources :sounds, only: [:new, :create]
member do
get 'sound_for'
end
end

root 'comics#index'
end

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

[view]

<h2>作品個別ページ</h2> <html> <img src="<%= @comic.image %>"> <p>作品名:<%= @comic.title %></p> <p>作者:<%= @comic.author %></p>

<a href="/comics/<%= @comic.id %>/sounds/new" target="_blank">音声を投稿する!</a>

<h2> みんなの投稿</h2>

<% @comic.sounds.each do |sound| %>

<p><%= sound.user.username %>さんの投稿</p>

<%= audio_tag sound_for_comic_path, :controls %>

<% end %>

<br />

<% @pages.each do |page| %>

<img src="<%=page.image%>" width="700px"> <br/>

<% end %>

</html>>

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

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

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

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

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

rifuch

2016/07/08 01:22

ソースの抜粋でいいので、少し見せてもらえませんか? 特に、オーディオデータを送る部分のコントローラアクションのあたり。
rifuch

2016/07/08 01:44

comicとsoundsのモデル定義も一部見せてもらえますか?特にhas_manyとかのあたり
YasutakaKonishi

2016/07/08 02:13

ありがとうございます。追記いたしました!
Kuchitama

2016/07/08 02:46

ちょっとしたことですが、ソースコードを記載する際は、 ``` で囲むと見やすくなります
YasutakaKonishi

2016/07/08 02:50

アドバイスありがとうございます!区切りました!
guest

回答1

0

ベストアンサー

comic has_many soundsの関連であるにもかかわらず(modelのソースが)、データを送る段でsoundが一意に取得出来てないのが原因ではないかと思います。

Ruby

1def sound_for 2 @sound= Comic.find(params[:id]).sounds 3 # この時点では、soundには、Comicインスタンスに関連したsounds全部(というか関連)が入っているはず 4 send_data(@sound.upload_file) # <==== ここでmethod undefinedが起きてませんか? 5 # 本来なら、送信したいsoundを一意に取得する必要があるはず 6 @sound = Comic.find(params[:id]).sounds.find(params[:sound_id]) 7 # それから、データを送信する 8 send_data(@sound.upload_file, filename: 'hoge.mp3', type: 'audio/mp3') # <===send_dataでは失敗しました 9 # 念のため、データ送信するときに、ファイル名及びファイルタイプでどのタイプのデータが送られているか示しておくとより安心かも 10 # 11end 12 13# Viewも 14# 前略 15<% @comic.sounds.each do |sound| %> 16 <p><%= sound.user.username %>さんの投稿</p> 17 <%= audio_tag sound_for_comic_path(@coumic, sound_id: sound), :controls %> 18<% end %> 19# 後略

追記ーーーーーーーーーーーーーーーーーーーーーー

audio_tagが表示されないのは、オプションの付け方が間違ってたせいでした。
また、send_dataではaudio_tagが音楽を再生してくれません。
send_fileを使う必要があるようです。

修正版

def sound_for @sound= Comic.find(params[:id]).sounds send_file @sound.upload_file_path end # view <% @comic.sounds.each do |sound| %> <p><%= sound.user.username %>さんの投稿</p> <%= audio_tag sound_for_comic_path(@coumic, sound_id: sound), controls: true %> <% end %>

投稿2016/07/08 04:38

編集2016/07/09 09:38
rifuch

総合スコア1901

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

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

YasutakaKonishi

2016/07/08 05:32

ありがとうございます!教えて頂いた通りコードを記載したのですが、なぜかプレイヤー部分が空白のままでした。。エラーは出ていないのですが、おそらく音声データをデータベースからうまく受け渡しができていないようです。
rifuch

2016/07/08 05:53

テスト的に、link_toでsound_for_comic_pathをコールして、ダウンロードされるデータが正しいものかどうかチェックして見てはどうでしょう?
YasutakaKonishi

2016/07/08 06:13

超初心者で、ご記載頂いたコードが書けず恐縮なのですが、binding.pryで確認したところ、どうやらsend_dataで、音声データは送ることができているようなので、やはり sound_for_comic_pathあたりに問題がありそうです。
rifuch

2016/07/08 09:10

どこにpryを仕掛けて確認しました? sound_for_comicアクションに仕掛けて、問題なく@sound.upload_fileが正しいデータとして取得出来ているのであれば、問題は起こらないはずなんですが。
rifuch

2016/07/08 09:18

1. 正しくデータがダウンロード出来るか、レンダリングされたソースのsrcを確認して、ブラウザからダウンロードしてみる (あるいは、audio_tagのあるところに、<%= link_to 'download', sound_for_comic_path %>と追記して、表示されるリンクから、ファイルをダウンロードしてみる) 2.ブラウザがそのメディアタイプの再生をサポートしているか確認する。以下のURLが参考になるかと  https://developer.mozilla.org/ja/docs/Web/HTML/Supported_media_formats 1.がうまくいかないとすれば、リンクの処理がうまくいってないという事で、2.であれば、アップするファイルタイプがだめだったという風に問題を切り分けできるかと思います。
YasutakaKonishi

2016/07/08 11:29

ご丁寧にありがとうございます。binding.pryあまり使い方わかっておらず、再度やってみたところ、からのようでした。また、audio_tagにlink_toを追加したところ、以下のようなエラーが表示されましたので、やはり1,リンクの処理がうまくいっていないようでした。 [エラー内容]Couldn't find Sound without an ID(@sound=〜の箇所が赤ライン) def sound_for @sound= Comic.find(params[:id]).sounds.find(params[:sound_id]) send_data(@sound.upload_file, filename: 'hoge.mp3', type:'audio/mp3') end
rifuch

2016/07/08 11:44

少し舌足らずでしたね。sound_idを渡すのであれば、link_toの行は、 <%= link_to 'download', sound_for_comic_path(@comic, sound_id: sound) %> でないとだめです。
YasutakaKonishi

2016/07/08 12:32

ありがとうございます。ご記載頂いた、link_toで、右クリックダウンロードしたところ、音声ファイルのDL&再生がでました。 audio_tagで表示はされないので、やはり2のブラウザが対応していないようです
rifuch

2016/07/08 12:34

使用しているブラウザと、ダウンロードするサウンドファイルのデータタイプをリンク先で見比べてみてください。 対応しているにもかかわらず、うまく再生出来ないのであれば、別な原因も考えられます。
YasutakaKonishi

2016/07/08 12:44

ありがとうございます。chromeで、データはmp3なので、対応しているはずなので、別の要因のようです
rifuch

2016/07/08 14:50

send_dataが良くないのかもしれませんね。全く違う環境ですが、video_tagの時に、send_dataで行うとうまくいかなかった経験があります。 試験的に、ファイル送信ならうまくいくかを試すために、 適当な所(public以下か、assets以下)にオーディオファイルを配置して、sound_for_comicアクションでそのオーディオファイルをsend_fileするか、あるいは、audio_tagの引数に直接埋め込んで、それが動作するか確認してみてはどうでしょうか? audio_tagの引数にそのファイルを指定して、実際に動作する事を確認し、send_fileでうまくいくのであれば、sound_for_comic_pathアクション内でDBから読み出したデータを一時ファイルに書き出してからsend_fileするようにすれば良いですし、send_fileでも状況が変わらないのであれば、オーディオファイルをDBに格納するのをあきらめて、ファイルストアを使うしかないでしょう。
YasutakaKonishi

2016/07/09 06:49

すいません、僕の能力ではまだご記載頂いたことの対応ができないので、もう少し勉強しようかと思います!send fileで代用することもできる可能性があるということなのですね。
YasutakaKonishi

2016/07/09 07:12

publicにファイルを置く @sound= Comic.find(params[:id]).sounds.find(params[:sound_id])と、ルートパスが取得できる(public/・・)という認識であっていますでしょうか? >sound_for_comic_pathアクション内でDBから読み出したデータを一時ファイルに書き出してからsend_fileするようにすれば良いですし また、上記がよく理解できませんでした。調べてみます。
rifuch

2016/07/09 09:00

publicにファイルを置くのは、テスト的にaudio_tagから指定するためです。 publicもしくはassets以外の場所に置いた場合、audio_tagからのリンクを張れないからです。 まず、この方法(audio_tagに静的なサウンドファイルを指定する)で、正常にaudio_tagが機能するかをチェックして、これを足がかりにしようという考えです。 とにかく正常に動くものが(たとえ静的であっても)あれば、問題点の洗い出しがしやすくなりますから。 静的なファイルでaudio_tagが機能する事を確認したら、今度は静的なファイルをsend_fileして、それが機能するか確かめる、という事です。 なので、audio_tagに静的なファイルを当てはめてOKで、send_fileがだめなら、データの保存先をpublic以下か、assets以下にして、DBにはファイルの名前もしくはファイルパスを格納する方法を取り(コンテンツの保護は出来なくなります。パスがわかった時点で、そのコンテンツに誰でもアクセスできますから) 次に、send_fileで成功するのであれば、public及びassets以外のディレクトリに、ファイルでデータを格納するか、DBに保存されたデータをどこか一時的なディレクトリにファイルで書き出してsend_fileする方法で、問題が解決できそうです。(DBのデータをファイルに書き出して送る方法は、なんだか冗長だし、後片付けが必要なのでお勧めしませんが) ただ、send_dataがだめな理由がちょっとわからないので、その辺を深く調べて見るのも良いかもしれません。
rifuch

2016/07/09 09:30

ちょっと気になったので、実際にプロジェクトを作って確認してみました。 まず、audio_tagが表示されないのは、オプションの付け方が間違っているせいでした。 正解は、 <%= audio_tag path_to_file, controls: true %> みたいな形式で、controlsのオプションをハッシュでつける必要があったようです。 次に、send_dataではやっぱりうまく再生出来ませんでした。使用したデータはmp3,SafariとChromeで試しましたが、どちらも失敗しました。 (Audioコントロールは表示されるが、再生されない) send_fileでは成功したので、DBにサウンドデータを格納するのはあきらめて、ファイルストアを利用するしかないでしょう。 sound_for_comicアクションでは、send_dataではなく、send_fileで送ってあげれば大丈夫でしょう。 回答の方も、編集しておきます。
YasutakaKonishi

2016/07/09 14:06

ご丁寧にありがとうございます!!controlsオプションの記載が間違っていたのですね、記載したところ、コントローラーを表示することができました。 そして、僕の設定では、コントローラーファイルで、音声も再生することができました。本当にありがとうございます! 大きいサイズをDBに送ろうとすると「 closed MySQL connection: ROLLBACK」がでるので、SequalProでDBのサイズを変更する設定を探し、修正して大枠が形になりそうです
rifuch

2016/07/09 14:35

逆に色々引っかき回してしまった気もしますが、解決して何よりです!
YasutakaKonishi

2016/07/10 05:48

初心者の質問にご丁寧に対応頂き、ほんとうにありがとうございました!これからももっとプログラミング能力を身につけていこうとおもいました!
rifuch

2016/07/10 10:19

色々引っかき回してしまった感がハンパないですが、問題点の切り分け方の練習にはなったかもしれませんね。これからもがんばってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問