2011-08-02 8 views
0

私はHeroku、Paperclip、S3を使って非常に簡単なことをしようとしています。ヘロクのS3の添付ファイルを移動

は、ここで私は一緒に入れカスタムrakeタスクです:だから

task :migrate => :environment do 
    @companies = Company.where("attachment_file_name IS NOT NULL")  
    @companies.each do |c| 
     if c.attachments.where("attachment_file_name = ?", c.attachment_file_name).blank? 
     # i.e. if there are no instances of Attachment that match c.attachment 
      a = Attachment.new(:company_id => c.id, :name => "Default") 
      a.attachment = c.attachment 
      a.save 
     end 
    end 
end 

、私は新しい添付モデルの新しいインスタンスにCompany.attachmentを移動しようとしています。私のローカル開発サーバー上で、それは美しく動作します。

一度Herokuにプッシュすると、次のエラーが表示されます。a.attachment = c.attachment

The specified key does not exist. 

私はHerokuのコンソールで添付ファイルを持っている会社のために手動操作を試してみて、私が手:

TypeError: can't convert nil into String 
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/storage/s3.rb:131:in `extname' 
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/storage/s3.rb:131:in `to_file' 
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/attachment.rb:81:in `assign' 
/app/vendor/plugins/paperclip/lib/paperclip.rb:245:in `attachment=' 

あなたはここで何が起こっているか知っていますか?


私はちょうどc.attachment = c.attachmentを試しました。同じエラー!!!

+0

暗いところで撮影しましたが、 'readattribute'を使って' c.attachment'属性を読み込もうとしましたか? 'a.attachment = c.read_attribute(:attachment)'のように?私はCarrierWaveを使用しなければならなかったので、画像属性を取得する必要がありました。なぜなら、彼らは舞台裏で奇妙なことをするので、PaperClipと同じ方法かもしれません。 – iwasrobbed

+0

@iWasRobbed - 私はHerokuコンソールで試しましたが、 'nil'値です。 – sscirrus

+0

あなたはこれに対する解決策を見つけましたか? – Smickie

答えて

0

c.attachment_file_nameのように見え、ペーパークリップでは何をするべきかわかりません。私はそれを回避するためにはnilですが、なぜあなたはちょうどそれがnillだかどうかを確認し、それがある場合はそれをスキップすることができますかわからない:

if c.attachment_file_name 
    if c.attachments.where("attachment_file_name = ?", c.attachment_file_name).blank? 
     # i.e. if there are no instances of Attachment that match c.attachment 
     a = Attachment.new(:company_id => c.id, :name => "Default") 
     a.attachment = c.attachment 
     a.save 
    end 
end 
+0

アイデアをありがとう。私はすでにfile_nameが存在することを確認しました。確かに、私の手作業では、ファイルがそこにあり、行く準備ができていることを保証しました。この問題の原因になるものがあります。 – sscirrus

0

添付ファイルとしてURLを受け入れるようにクリップのモデルを修正する考えがあります?そうすれば、添付ファイルを新しいモデルに移植し、ペーパークリップs3の記憶装置を根本的に変更することはできません。

あなたの新しいモデルにこれを追加します。そして、それにパラメータを渡す、新しい添付オブジェクトを作成するために...

before_validation :download_remote_attachment, :if => :attachment_url_provided? 

attr_accessor :attachment_url 

    private 

    def attachment_url_provided? 
    !self.attachment_url.blank? 
    end 

    def download_remote_attachment 
    self.file = do_download_remote_image 
    end 

    def do_download_remote_attachment 
    io = open(attachment_url) 
    def io.original_filename; base_uri.path.split('/').last; end 
    io.original_filename.blank? ? nil : io 
    rescue 
    end 

を:attachment_urlをして、それはそれをダウンロードし、再それを処理し、それを新しいモデルの添付ファイルとして保存します。唯一の欠点は、添付ファイルがS3に2回保存されることです。あなたのアプリの要求に応じて、それは良いことかもしれないと思った

0

ここでは、暗闇の中でもう1つの長時間の撮影が、「なぜ開発DBではなく、プロダクションDBではない」という角度からです。万が一attachmenthas_many :throughの関係で利用できますか?結合テーブルに主キーが追加されている場合、このタイプの奇妙なエラーがmySQLで発生する可能性があります。しかし、sqLite3でも動作します。だから、一度生産に行くと、エラーが表示されます。ちょっとした考え。

関連する問題