使用Rails Paperclip gem在保存之前预处理文件

时间:2012-10-25 15:32:27

标签: ruby-on-rails paperclip

我在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访问该文件 - 关于我哪里出错以及如何修复它的想法?

1 个答案:

答案 0 :(得分:2)

似乎问题正是错误所说的...... origfileHash,而不是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