1

我正在关注本教程http://net.tutsplus.com/tutorials/create-a-simple-music-streaming-app-with-ruby-on-rails/,但使用 aws_sdk 而不是 aws_s3。我看到他们基本上做同样的事情。在下载部分,我将下载功能放入模型中,它确实正确显示了要下载的 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实例。当 to 的第二个参数link_to不是字符串时,它假定它是一个 activemodel 类并尝试从中找到适当的路由。例如,如果你这样做

link_to 'Show', person

而 person 是 Person 的一个实例,link_to 最终会从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 

显然,aws_s3 中的等效方法返回字符串而不是 URI 对象,这就是您所遵循的教程不会这样做。

于 2012-12-28T12:25:43.330 回答