2011-01-25 8 views
0

だ見つけることができません:クリップの添付ファイルにモデルのメソッドを実行した後に作成または更新(ペーパークリップのコールバックが動作していないようです)ペーパークリッププロセッサは、それが以前のファイル

を編集(その日) 私は考え出し私の問題を解決する。プロセッサは、更新されたファイルと明らかに動作しますが、処理後までファイルを保存しません。私はZip :: ZipFileを変更しました。なぜなら、添付ファイルパスは実際にはまだ何も保持していないので、 'attachment.path'ではなく 'file'を開くことです。これは最初の問題を修正しました。今私は追跡する必要がある他の問題があります。しかし、以下の答えはほとんど正しいです。

編集(2011年1月31日):

だから私は必要なすべてのアクションを実行します私の取り付けのためのプロセッサを作成するために、アドバイスをとっています。これまでのところ、動作するはずです。プロセッサが起動し、すべての初期化作業を実行します。しかし、アップロードされるzipファイルにアクセスしたいという要点が出たら、ファイルが見つからないというエラーが表示されます。私のプロセッサ用のコードは以下の通りです:

class Extractor < Processor 
    attr_accessor :resolution, :whiny 
    def initialize(file, options = {}, attachment = nil) 
     super 
     @file = file 
     @whiny = options[:whiny].nil? ? true : options[:whiny] 
     @basename = File.basename(@file.path, File.extname(@file.path)) 
     @attachment = attachment 
     @instance = attachment.instance 
    end 
    def make 
     # do your conversions here, you've got @file, @attachment and @basename to work with 
     export_path = attachment.path.gsub('.zip', '_content') 

     Zip::ZipFile.open(attachment.path) { |zip_file| 
     zip_file.each { |image| 
      image_path = File.join(export_path, image.name) 
      FileUtils.mkdir_p(File.dirname(image_path)) 
      unless File.exist?(image_path) 
      zip_file.extract(image, image_path) 
      # ..stuff that it does.. 
      end 
     } 
     } 
     # clean up source files, but leave the zip 
     FileUtils.remove_dir(export_path) 


     # you return a file handle which is the processed result 
     dst = File.open result_file_path 
    end 
end 

そして、ここでは、私が手にエラーの内容です:

Zip::ZipError in GalleriesController#create 

File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found 

Rails.root: /home/joshua/railscamp/moments_on_three 
Application Trace | Framework Trace | Full Trace 

config/initializers/extractor.rb:16:in `make' 
app/controllers/galleries_controller.rb:32:in `new' 
app/controllers/galleries_controller.rb:32:in `create' 

Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=", 
"gallery"=>{"name"=>"DelRosario", 
"public"=>"0", 
"owner_id"=>"1", 
"shoot_date(1i)"=>"2011", 
"shoot_date(2i)"=>"1", 
"shoot_date(3i)"=>"31", 
"category_id"=>"1", 
"archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip", 
@content_type="application/zip", 
@headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n", 
@tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>}, 
"commit"=>"Create Gallery"} 

私はそれが正しい場所にファイルを探して伝えることができるものから、しかし、そのファイルはまだアクセスされていないようです。私が知っている限り、Paperclipはそれを処理しようとする前に、添付ファイルがアップロードされるのを知り、それを待つほどスマートです。誰でも私がここで間違っていることに気付くことができますか?

ありがとうございます。

古いもの:

私はRailsの3とペーパークリップを使用したフォトギャラリーアプリを開発しています。管理者はギャラリーを作成し、一連の画像を含むzipファイルをアップロードすることができます。私は起こるしたい何

  1. は、フォームにアップロードするギャラリー情報とzipファイルを入力します。
  2. 「ギャラリーを作成」ボタンを押してください。
  3. フォーム投稿、ギャラリー保存、およびzipファイルがアップロードされます。
  4. zipファイルをアップロードしたら、extract_photos(btw、this code 作品)メソッドを実行します。 4.a.この方法の最後に、zipファイルが破棄されます。
  5. 管理者はギャラリーページにリダイレクトされ、その中のすべての写真が表示されます( ギャラリーには写真があります)。

私はこの作業をいくつかの方法で行いました。

以前は、:extract_photosメソッドを実行しているリンクを管理者がクリックできるコントローラメソッドを作成しました。これは私のコンピュータで動作しましたが、何らかの理由でサーバがクライアントのコンピュータ上でこれをルーティングするのに問題がありました。だからそれは無駄だ。プラス私はそれがそれをやっての醜い方法だと思った。

最近、コールバックメソッドを使用しようとしました。 after_saveは明らかにPOSTのフォームを中断し、ファイルがアップロードされず、:extract_photosメソッドがファイルを見つけることができないために機能しませんでした。私はペーパークリップのgithubのページでコールバックメソッドをチェックアウトし、それがコールバックを語る

ポスト処理 ステップの前と後に、ペーパークリップができるように、いくつかのコールバックで戻っ モデルに呼び出し、 処理ステップを変更またはキャンセルするモデル。コールバックは 「before_post_process」と(各取付前と の処理の後 呼ばれる) 「after_post_process」、及び アタッチメント固有 「beforepost_process」と 「afterpost_process」です。あなたはfalseを返す場合、コールバックは、そう を可能な限り通常の ActiveRecordのコールバックに近いことを を目的としている(特に - 返すnilは同じではありません)フィルタの前に、後処理 ステップが停止します に。フィルタ後に のfalseを返すと、何も停止しません。 が必要ですが、モデルにアクセスして 添付ファイルにアクセスできます。私はあると思い

私はbefore_post_processとafter_post_processを使用して試してみたが、それはプロセスを実行するためのファイルを見つけることができないので、明らかに時間によってアップロードされたばかりされていないファイルは、これらのメソッドが呼び出さなっています(奇妙な)。さらに、beforepost_processとafterpost_processを試すと、NoMethodErrorが返されます。

添付ファイルを作成または更新するときに、ファイルをアップロードして適切な場所に置いた後に、そのメソッドを呼び出すにはどうすればよいですか?

UPDATE

Iは、プロセッサのメイク方法に私の抽出方法コードを移動する、次のコードを試してみました。これまでプロセッサーを作成しようと思っていたよりもずっと遠くになってしまっていますが、まだまだ進んでいません。ファイルが存在しないと言って、処理のためにアップロードしたファイルを開こうとすると、プロセスは例外をスローします。命名規則は正しく、すべてですが、はまだです。プロセスがトリガーされる前に何もアップロードされていません。なぜ誰が何が起こっているのか分かりませんか?

答えて

2

これを実現する独自のプロセッサを作成することができます。お使いのモデルで

クリップのものを宣言

has_attached_file :my_attachment, { 
    :styles => {:original => {:processors => [:my_processor]}} 
    }.merge(PAPERCLIP_SETTINGS) 

が、その後、独自のプロセッサを書き、入れカスタムプロセッサを追加して設定/初期化子:

module Paperclip 
    class MyProcessor < Processor 
    attr_accessor :resolution, :whiny 
    def initialize(file, options = {}, attachment = nil) 
     super 
     @file = file 
     @whiny = options[:whiny].nil? ? true : options[:whiny] 
     @basename = File.basename(@file.path, File.extname(@file.path)) 
     @attachment = attachment 
    end 
    def make 
     # do your conversions here, you've got @file, @attachment and @basename to work with 

     # you return a file handle which is the processed result 
     dst = File.open result_file_path 
    end 
    end 
end 

は、私は物事へのカスタムプロセッサを使用しています途中でたくさんの処理や変換をしているのと似ていて、うまくいくようです。

+0

親モデルとプロセッサ内のすべてにアクセスできますか?主要な機能の1つは、ギャラリーから現在抽出されているファイルとの一連の依存オブジェクトを構築することです。また、プロセッサに関するドキュメントは事実上存在しません。 –

+0

私は今日これを試して、抽出プロセッサを呼び出していますが、実際にファイルを開いてそこから抽出するときは、ファイルが見つかりません。探しているファイルは正しいですが、まだ解凍できません。何か案は? –

+0

あなたは@ attachment.instance – Kalendae

関連する問題