2011-08-09 48 views
1

私はペーパークリップで厄介な問題に直面しています。関連するモデルのdestroyメソッドを呼び出すとき。データベースレコードは削除されますが、添付ファイルは削除されません。 私はレールサーバのログを見ましたが、ファイル "添付ファイルの削除"のみが表示され、ファイルを削除するためのログは表示されません。ペーパークリップの添付ファイルが削除されていません

私はファイル名の補間を使用して、アップロードされたファイルの名前を変更しています(コードを参照)。 この補間を削除すると(削除:パス&:モデルからのURL)、destroyメソッドが正しく動作していることがわかりました。だから私は根本的な原因を確信しています:ファイル名補間。 間違った方法で補間を使用していますか?それはペーパークリップの既知の問題ですか?

:path =>  ":rails_root/public/system/:attachment/:id/:style/:normalized_photo_file_name.:extension", 
:url => 
"/system/:attachment/:id/:style/:normalized_photo_file_name.:extension" 


    Paperclip.interpolates :normalized_photo_file_name do |attachment, style| 
    attachment.instance.normalized_photo_file_name 
    end 

    def normalized_photo_file_name 
    if @rnd.nil? 
     @rnd= SecureRandom.hex(4) 
    end 
    "photo_#{@rnd}" 

    end 

答えて

1

はい、あります。補間は再現性があると考えられ、特定のコントローラのすべての呼び出しに対して正確に同じ値を返す必要があり、すべての呼び出しでランダムな値を生成している場合もあります。

オブジェクトが破棄されると、補間が再び呼び出され、異なるランダム値が生成され、これを見つけることはありません新しいファイル。この16進値を実際に作成したい場合は、それをモデルに生成して格納するか、ランダムを使用する代わりに、ダイジェストのようなハッシングアルゴリズムを使用します。

#put this somewhere 
require 'digest/md5' 

def normalized_photo_file_name 
    "photo_#{Digest::MD5.hexdigest(self.id.to_s)}" 
end 

これは、すべてのモデルで同じ値が生成され、破壊メソッドが正しく動作することを保証します。

+0

Ohh!そうかもしれない。しかし、私はまだ破壊が呼び出されたときに '@ rnd'変数がなぜnilであるのか不思議です。私はレールで新しいです、私は何かを逃したのですか? '@ rnd'の目的は、次の補間呼び出しのために常に同じランダム値を持つことでした。 – enenkey

+0

インスタンス変数です。インスタンスがなくなれば消えてしまいます。データベースからオブジェクトを取得するときには、常にオブジェクトを再度読み込み(新しいインスタンスを作成する)ことになります。 –

+0

ご説明いただきありがとうございます – enenkey

関連する問題