3

我在 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.read(origfile)行引发错误ArgumentError (Invalid argument 'file'. Expected String, got Hash. ) 。如果我尝试类似elf = ElfObject.read(origfile.path)的方法,我会得到NoMethodError (undefined method `path' for #)

显然,我不完全了解如何在文件发布之前从 Paperclip 访问文件——关于我哪里出错以及如何修复它的任何想法?

4

1 回答 1

2

似乎问题正是错误所说的……那origfile是 a Hash,而不是 a String

如果是这种情况,则attachment.queued_for_write返回 a 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
于 2012-10-25T15:50:50.650 回答