1

このチュートリアルhttp://net.tutsplus.com/tutorials/create-a-simple-music-streaming-app-with-ruby-on-rails/に従いますが、aws_s3 の代わりに aws_sdk を使用します。基本的に彼らは同じことをしているのがわかります。ダウンロード部分では、ダウンロード関数をモデルに入れ、ダウンロードする URL を正しく表示しましたが、そこからダウンロードをトリガーする方法がわからないため、関数をヘルパーに移動し、ビューから直接呼び出します. そこから、Railsは URI::HTTPS:Class の未定義のメソッド `model_name'について不平を言い続けます

ダウンロード方法はこちら

def download song_key
  bucket = AWS::S3.new.buckets['mybucket'] # error from this line because undefined AWS::S3
  song = bucket.objects[song_key]
  song.url_for(:read, expires: 10*60)
end 

これがビューです

<% @songs.each do |song| %>
  <%= link_to "download", download(song.key) %>
<% end %>

それを修正する方法はありますか?ありがとう

4

1 に答える 1

3

スタック トレースの読み方が少し間違っています。ヘルパー メソッドが例外を発生させているのではなく、内部の何かlink_toです。

メソッドはインスタンスurl_forを返していURI::HTTPSます。の 2 番目の引数がlink_to文字列以外の場合、アクティブモデル クラスであると想定し、そこから適切なルートを見つけようとします。たとえば、

link_to 'Show', person

person は Person のインスタンスであり、link_to は から URL を生成することになりperson_path(person)ます。

URI はアクティブなモデルではないため、適切なルートを見つけるこのプロセスは失敗します。必要なことは、URI を文字列に変換することだけです。たとえば、

def download_url song_key
  bucket = AWS::S3.new.buckets['mybucket'] # error from this line because undefined AWS::S3
  song = bucket.objects[song_key]
  song.url_for(:read, expires: 10*60).to_s
end 

どうやら、あなたがフォローしているチュートリアルであるURIオブジェクトではなく文字列を返すaws_s3の同等のメソッドは、これを行いません。

于 2012-12-28T12:25:43.330 に答える