在helper中定义方法时未定义的AWS :: S3

时间:2012-12-28 12:03:22

标签: ruby-on-rails amazon-s3

我正在关注本教程http://net.tutsplus.com/tutorials/create-a-simple-music-streaming-app-with-ruby-on-rails/,但使用aws_sdk而不是aws_s3。我基本上看到他们做同样的事情。在下载部分中,我将下载功能放入模型中,它确实显示了要下载的URL,但是从那里我不知道如何触发下载所以我将函数移动到帮助器并直接从视图中调用它。从那里开始抱怨为URI :: HTTPS 未定义的方法`model_name':Class

这是下载方法

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 %>

知道怎么解决吗?感谢

1 个答案:

答案 0 :(得分:3)

你正在读取堆栈跟踪错误 - 这不是你的帮助方法引发异常,而是link_to内的某些东西。

url_for方法返回URI::HTTPS个实例。当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对象,这是你所遵循的教程不会这样做。