Rails中“#string:0x007ffaf0049a28>”的“未定义方法`文件”?</string:0x007ffaf0049a28>

时间:2013-06-02 21:27:11

标签: ruby-on-rails amazon-s3 carrierwave jquery-file-upload

我收到此错误

undefined method `file' for #<String:0x007ffaf0049a28>

尝试显示文件的content_type(例如图像/ jpg)时。我正在使用Carrierwave + Jquery文件(经过大量修改,以我想要的方式一起工作)+ Amazon s3(click this to see what I'm doing)。它之前只有载波和&amp;亚马逊s3,但当我添加了jquery文件上传&amp;直接s3,它不再工作了。

有人可以帮帮我吗?这就是我正在做的事情:

<%= @post.attach.file.content_type %>

提前谢谢你&amp;如果您需要更多代码/信息,请告诉我

@post.attach.inspect
# https://sharebook.s3.amazonaws.com/uploads/d4247713-6459-484f-9b8b-f0b7b689e8d9/picture.jpg

@post.inspect
# #<Post id: 1, name: "post title", attach: "https://domain.s3.amazonaws.com/uploads/d4247713...", created_at: "2013-05-29 17:30:46", updated_at: "2013-05-29 17:30:46">

更多信息:我正在使用storage :fog。在我的载波上传器中,我已经包含了

CarrierWave::MimeTypes process :set_content_type

2 个答案:

答案 0 :(得分:1)

您是否存储了内容类型,即使用carrierwave-meta gem? 文件不具有mime类型,多部分形式的部分具有。
Carrierwave可以在上传文件时获取文件的mime_type 因此,将其作为元数据与上传的文件一起存储是很常见的。

安装carrierwave-meta并添加元数据的字段后(参见github page of carrierwave-meta),您可以

  process :set_content_type
  process :store_meta
在您的上传器中

并使用

访问content_type
@post.attach.content_type

您想方设法通过扩展名查找mime_types。

文件扩展名只是Win主要使用的提示。 Unix依赖于文件内容(魔术字符等),MacOS存储在资源分叉中的元数据。说这个,有一种方法可以查找:

Mime::Type.lookup_by_extension 

请参阅Rails API

所以存储在S3中的文件的mime_type:

mime_type = Mime::Type.lookup_by_extension(File.extension(@post.attach.inspect))

答案 1 :(得分:0)

这里有点难以辨别,但看起来你的“附加”值是“#”(一个字符串)。尝试做类似的事情......

<%= @post.attach.inspect %>

要确定,甚至只是......

<%= @post.inspect %>

看看它们是什么。 “附加”是否应该是“附件”?