質問

以前:作成または更新後にペーパークリップ添付ファイルでモデルメソッドを実行する

編集(その日遅く)私は自分の問題を見つけました。プロセッサは、更新されたファイルでは明らかに動作しますが、処理後までファイルを保存しません。 zip :: zipfileを変更して、「添付ファイル」ではなく「ファイル」を開きました。これにより、最初の問題が修正されました。今、私は追跡する必要がある他の問題を抱えています。しかし、以下の答えはほとんど正しいです。

編集(1/31/2011):

そこで、必要なすべてのアクションを実行する添付ファイルのプロセッサを作成するためのアドバイスを受けました。これまでのところ、機能するはずのようです。プロセッサは、明らかにすべての初期化のものを開始し、実行します。ただし、アップロードされる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とPaperClipを使用してフォトギャラリーアプリを開発しています。管理者はギャラリーを作成し、多数の画像を含むzipファイルをアップロードできます。

私が起こりたいこと:

  1. ギャラリー情報とzipファイルを入力して、フォームにアップロードします。
  2. 「ギャラリーの作成」ボタンを押します。
  3. フォーム投稿、ギャラリー保存、zipファイルがアップロードされます。
  4. zipファイルがアップロードされたら、メソッドを実行します:extract_photos(ところで、このコードは機能します)。 4.a.この方法の最後に、zipファイルが破壊されます。
  5. 管理者は、すべての写真が含まれているギャラリーページにリダイレクトされます(ギャラリーがhas_many写真)。

私はこの作業をいくつかの異なる方法にしようとしました。

以前は、管理者が次のようなリンクをクリックできるようにするコントローラーメソッドを作成しました。これは私のコンピューターで機能しましたが、何らかの理由でサーバーはこれをクライアントのコンピューターでルーティングするのに苦労していました。だからそれはやりません。加えて、私はそれがそれをする醜い方法だと思った。

最近、コールバックメソッドを使用してみました。 Form Postを中断し、ファイルがアップロードされず、Extract_Photosメソッドがファイルを見つけることができないため、Form Postを中断しているため、機能しませんでした。

PaperClip Githubページでコールバックメソッドをチェックしましたが、コールバックについて説明しています。

ポストプロセッシングステップの前後に、PaperClipはいくつかのコールバックを使用してモデルに呼び戻し、モデルが処理ステップを変更またはキャンセルできるようにします。コールバックは、「before_post_process」および「after_post_process」(各添付ファイルの前後に呼び出されます)、および添付ファイル固有の「beforepost_process」および「afterpost_process」です。コールバックは、できるだけ通常のActiverCordコールバックに近いことを目的としているため、False(具体的には-Nilを返すことは同じではない)を前のフィルターで返す場合、ポストプロセッシングステップは停止します。後のフィルターでfalseを返すことは何も停止しませんが、必要に応じてモデルと添付ファイルにアクセスできます。

before_post_processとafter_post_processを使用しようとしましたが、プロセスを実行するファイルを見つけることができないため、これらのメソッドが呼び出されるまでにファイルは明らかにアップロードされません(奇妙だと思います)。さらに、beforepost_processとafterpost_processを試してみると、nomethoderrorを取得します。

では、添付ファイルが作成または更新されたときにメソッドを呼び出すにはどうすればよいですか?

アップデート

以下のコードを試して、抽出方法コードをプロセッサの作成方法に移動しました。私は以前よりもプロセッサを書き込もうとしていたよりも遠くになりましたが、それはまだノーゴーです。プロセスは、ファイルが存在しないと言って、処理用にアップロードされたファイルを開こうとするとすぐに例外をスローします。命名スキームは正しく、すべてですが、 まだ プロセスがトリガーされる前に、何もアップロードされていません。なぜこれが起こっているのか誰もが考えていますか?

役に立ちましたか?

解決

これを達成するために独自のプロセッサを書くことができます。

ペーパークリップのものを宣言するときのモデルでは、カスタムプロセッサを追加します

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

次に、独自のプロセッサを作成して、config/initializersを入れます。

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

私はカスタムプロセッサを使用して、中央のファイルの多くの処理と変換であなたがしていることに似たものに使用していますが、それはうまく機能しているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top