3

Rails3.2アプリでPaperclipgemを使用しています。このアプリでは、ユーザーが画像やその他の情報を含む特殊なファイルタイプをアップロードできます(これを「.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(無効な引数'ファイル'。予期された文字列、取得したハッシュ。)が発生します。elf = ElfObject.read(origfile.path)のようなものを試してみると、NoMethodError(#の未定義のメソッド `path')が発生します。

明らかに、投稿される前にPaperclipからファイルにアクセスする方法を完全に理解していません。どこが間違っているのか、どのように修正するのかについてのアイデアはありますか?

4

1 に答える 1

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
于 2012-10-25T15:50:50.650 に答える