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

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

詳細はこちら
Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1787閲覧

rails上で投稿されたmp3再生について

yurayura777

総合スコア1

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/02/04 09:51

編集2021/02/05 01:34

前提・実現したいこと

railsを用いて作成したアプリ上でユーザーが投稿したmp3ファイルを再生したいです。
対象のmp3はActive Storageを用いて保存しています。

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

Sprockets::Rails::Helper::AssetNotFound in Tweets#index Showing /Users/tatsu/projects/mupician/app/views/tweets/_tweet.html.erb where line #18 raised: The asset "" is not present in the asset pipeline.

該当のソースコード

view

1<div class="content_post" style="background-image: url(<%= tweet.image %>);"> 2 <div class="more"> 3 <span><%= image_tag 'arrow_top.png' %></span> 4 <ul class="more_list"> 5 <li> 6 <%= link_to '詳細', tweet_path(tweet.id), method: :get %> 7 </li> 8 <% if user_signed_in? && current_user.id == tweet.user_id %> 9 <li> 10 <%= link_to '編集', edit_tweet_path(tweet.id), method: :get %> 11 </li> 12 <li> 13 <%= link_to '削除', tweet_path(tweet.id), method: :delete %> 14 </li> 15 <% end %> 16 </ul> 17 </div> 18 <p><%= tweet.musician%> <%= tweet.music%> <%= tweet.text %> <%= tweet.audio.inspect %></p> 19 20 21 <span class="name"> 22 <a href="/users/<%= tweet.user.id %>"> 23 <span>投稿者</span><%= tweet.user.nickname %> 24 </a> 25 </span> 26</div>

tweetmodel

1class Tweet < ApplicationRecord 2 belongs_to :user 3 has_many :comments 4 has_one_attached :audio 5 with_options presence: true do 6 validates :text 7 validates :musician 8 validates :music 9 validates :image 10 validates :audio 11 end 12end

form

1<%= form_with(model: tweet, local: true) do |form| %> 2 <%= form.text_field :image, placeholder: "Image Url" %> 3 <div>曲</div> 4 <%= form.file_field :audio %> 5 <%= form.text_area :musician, placeholder: "musician"%> 6 <%= form.text_area :music, placeholder: "music"%> 7 <%= form.text_area :text, placeholder: "text", rows: "10" %> 8 <%= form.submit "SEND" %> 9 <% end %>

試したこと

sequel proを確認したところmp3の保存はできていました。
audiojs-railsも導入ずみです

補足情報(FW/ツールのバージョンなど)

HTML5 Rails 6.0.3.4を使用しています

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

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

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

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

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

m.ts10806

2021/02/04 10:14

tweet.audio」の型は何でしょう。 テーブル定義(マイグレーションで作ったのならマイグレーションファイル)を提示してください。
yurayura777

2021/02/04 11:47 編集

ありがとうございます。active storageのテーブルのためマイグレーションファイルはactive storageのものしかありません。型はアップロードしたものはmp3になります
m.ts10806

2021/02/04 11:41

質問は編集できます。 「型」はオブジェクトの観点です。「mp3」という型はないはずです。 Tweetsテーブルのaudioカラムには何が入ってますか? 説明文や概念ではなく具体例をあげてください。 ファイルの実態なのか、パスなのか、拡張子なのか ファイルなら形式は何なのか、 パスならどういう形なのか で出力の仕方が全然違ってきます。
yurayura777

2021/02/04 11:49

すいません、active storageで保存してTweetテーブルに、モデルで記述してあるhas_one_attachedで紐付けているためおそらくファイルの実態だと思われます
oakbow

2021/02/04 22:15 編集

エラーが出ているのは <%= audio_tag tweet.audio %> だと思うのですが、額面通り解釈すると、tweet.audio の値を取得できないのが原因です。 indexアクションなので複数のtweetをループで表示していると思うのですが、該当のtweetのaudioに値が入っているか確認できますか? DBの中身を見るのもいいですが、ActiveStorage の構造理解していないとちゃんと入っているかどうか分かりづらいので、例えば該当の箇所を <%= tweet.audio %> に変えたりしてみるとわかるかな。 エラーの発生している該当行だけでなく、ある程度まとめて(よく分からないならそのファイル全部)ソース貼った方が回答者は理解しやすいです。
yurayura777

2021/02/05 01:31 編集

すいません、間違えました質問の方編集しておきます
m.ts10806

2021/02/05 01:28

質問は編集できますので。
yurayura777

2021/02/05 01:29

モデルとフォームは質問記事に書いているコードのみで1つのファイルになります
oakbow

2021/02/05 01:39

`tweet.audio.inspect` は私がお願いして書いていただいたものなので、元に戻してくださいね。
yurayura777

2021/02/05 01:47

はい!、消しておきます!
guest

回答1

0

ベストアンサー

以下のように変えるとエラーが出なくならないでしょうか?

<%= audio_tag tweet.audio %> ↓ <% if tweet.audio.present? %><%= audio_tag tweet.audio %><% end %>

もし直ったら、 audio をきちんと添付できていない tweet がどこかにあるのが原因です。
Tweet クラスのヴァリデーション定義を見る限り必須にしてありますが、修正前に登録したとかテストデータを入れてみたとかで、そうじゃないデータがあったりするのかもしれません。

これで収束しないようでしたらまた教えてください。


収束しませんでしたか。残念。

<%= audio_tag tweet.audio %>

<%= tweet.audio.inspect %>

に変えてみて、記載される結果を教えてください。


audio_tag って使ったことないけど image_tag と同じノリでは使えないのかな?

<%= audio_tag tweet.audio %>  ↓ <%= audio_tag url_for(tweet.audio) %>

ではどうでしょうか。


もしくはこちらかな?

<%= audio_tag rails_blob_url(tweet.audio) %>

手元で試せないので手探りですいません


audio_tag を使わずに試すとどうでしょうか。

<audio src="<%= url_for(tweet.audio) %>" controls> or <audio src="<%= rails_blob_url(tweet.audio) %>" controls>

ちなみに、ActiveStorage の有効期限はデフォルトで5分なので、ページを表示してすぐじゃないと再生できないと思います。
とりあえず有効期限を伸ばす場合は以下のコードを追加します。

# config/initializers/active_storage.rb ActiveStorage::Service.url_expires_in = 1.hour

単にコントロール表示してないだけだったのかな?
んじゃこちらでも動くと思います。

<%= audio_tag url_for(tweet.audio), controls: true %>

他に autoplay などのオプションもあります。

投稿2021/02/04 22:20

編集2021/02/05 02:06
oakbow

総合スコア227

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

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

yurayura777

2021/02/05 01:14

回答ありがとうございます。 ``` <% if tweet.audio.present? %><%= audio_tag tweet.audio %><% end %> ``` と記述してみたところ先ほどまでと同じエラーが出ました。しかし ``` <% if tweet.audio.present? %><%= tweet.text %><% end %> ``` このように書いてみたところtweet.textは表示されたためtweet.audio自体はちゃんと保存されていると思われます。また<%= tweet.audio %> のみの記述に変更してみたところ<ActiveStorage::Attached::One:0x00007fe13530e878>という文字列が表示されました。 勉強中の身のためわからないことが多くご迷惑をおかけして申し訳ございませんが、参照していただくものとしてどちらのコードやファイルをみていただいたらよろしいでしょうか?
oakbow

2021/02/05 01:18

うまくいきませんでしたか。こちらももっと調べてみます。 該当のコードの一行だけ切り取ると周りが分からないので、どこまで貼ればいいか分からないならファイル全部を貼ってください。
yurayura777

2021/02/05 01:37 編集

了解しました!、非常にありがたいです。 <%= audio_tag url_for(tweet.audio) %>こちらの記述に変更したところ <ActiveStorage::Attached::One:0x00007fe12de4ed58 @name="audio", @record=#<Tweet id: 2, text: "a", musician: "teto", music: "pain", image: "https://imgs.ototoy.jp/feature/image.php/20180321/...", user_id: 1, created_at: "2021-02-04 09:03:23", updated_at: "2021-02-04 09:03:23">>と画面上に表記されました。 コードの方はマークダウンで記述するためコメントの方に貼らせていただきます。
yurayura777

2021/02/05 01:36

<%= audio_tag url_for(tweet.audio) %> こちらの記述に変更したところ、画面上で先ほどまで<ActiveStorage::Attached::One:0x00007fe12de4ed58 @name="audio", @record=#<Tweet id: 2, text: "a", musician: "teto", music: "pain", image: "https://imgs.ototoy.jp/feature/image.php/20180321/...", user_id: 1, created_at: "2021-02-04 09:03:23", updated_at: "2021-02-04 09:03:23">>が表示されていたところに何も表示されなくなりました
oakbow

2021/02/05 01:38

オブジェクト内容の表示をやめているので消えるのはもちろん正しいんですが、エラー解消していないでしょうか?audio_tagだと音楽再生できるものだとは思うんですが。
oakbow

2021/02/05 01:40

<%= url_for(tweet.audio) %> をどこかに書き出して、これの結果を教えてください
yurayura777

2021/02/05 01:46

<%= audio_tag url_for(tweet.audio) %>だとエラーは解消しました。再生バー等がなくどのように音声ファイルを再生できるかわからない状態です。 <%= url_for(tweet.audio) %>だと /rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--3e02d80cb80945e9716e9add4703afee518052ce/Pain%20Pain%20Pain%20-%20teto.mp3と出力されています
yurayura777

2021/02/05 02:02

<audio src="<%= url_for(tweet.audio) %>" controls> こちらのコードを使用したところ、再生バーが表示され再生できました。ほんとにありがとうございます!!!!
yurayura777

2021/02/05 02:10

<%= audio_tag url_for(tweet.audio) controls: true %> こちらだとなぜかシンタックスエラーになります。 ActionView::SyntaxErrorInTemplate in TweetsController#index SyntaxError: /Users/tatsu/projects/mupician/app/views/tweets/_tweet.html.erb:18: syntax error, unexpected tLABEL, expecting ')' ... url_for(tweet.audio) controls: true );@output_buffer.safe_a... ... ^~~~~~~~~
oakbow

2021/02/05 02:11

カンマを記載し忘れていたので付けてください
yurayura777

2021/02/05 02:18

正常に動きました!!他の投稿でも試してみたところちゃんとその投稿に紐づいた音声ファイルが再生されました、お手数をおかけいたしました、心より感謝申し上げます!
oakbow

2021/02/05 02:24

image_tag は ActiveStorageを簡単に扱えるようになっているんですが、audio_tag はそうなっていないところがハマりどころでしたね。私も知りませんでしたが、audio_tag を使っている人が全然いないのでそうした情報も見当たりませんでしたし。解決してよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問