我在Rails 3.2应用程序上使用Paperclip gem,用户可以上传包含图像和其他信息的专用文件类型(让我们称之为“.elf”文件)。
我已经编写了通过一个名为ElfObject的类从elf文件中提取图像所需的所有代码,这在应用程序控制台中进行测试时效果很好。我想要做的是在Paperclip将其保存到AWS S3之前从.elf文件中提取图像和其他数据,将其他数据存储在模型中,然后将图像对象保存为S3上的Paperclip附件。这是模型中的相关代码:
class Photo < ActiveRecord::Base
validates_attachment :attachment,
:presence => true
has_attached_file :attachment,
:storage => :s3,
[[S3 credentials removed]]
before_attachment_post_process :import_photo
attr_accessible :name, :attachment, :properties
def import_photo
if attachment_file_name =~ %r{^*\.elf$}
origfile = attachment.queued_for_write
elf = ElfObject.read(origfile)
properties = elf.get_properties
attachment = elf.image.write "image_for_#{attachment_file_name}.png"
save!
end
end
当我尝试在应用程序上上传这种方式时,它会从 elf = ElfObject行引发错误 ArgumentError(无效参数'文件'。预期字符串,得到哈希。)。读(origfile)。如果我尝试使用 elf = ElfObject.read(origfile.path)之类的东西,我会得到 NoMethodError(#的未定义方法`path')。
显然,我还没有完全理解如何在发布之前从Paperclip访问该文件 - 关于我哪里出错以及如何修复它的想法?
答案 0 :(得分:2)
似乎问题正是错误所说的...... origfile
是Hash
,而不是String
。
如果是这种情况,则attachment.queued_for_write
返回Hash
,这意味着您需要找到包含文件路径字符串的密钥。
origfile = attachment.queued_for_write
p origfile.inspect #print it out so you can figure out what key holds the path
编辑回答试试这个:
def import_photo
if attachment_file_name =~ %r{^*\.elf$}
origfile = attachment.queued_for_write[:original]
elf = ElfObject.read(origfile.path)
properties = elf.get_properties
attachment = elf.image.write "image_for_#{attachment_file_name}.png"
save!
end
end