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は、添付ファイルの処理を試みる前に、添付ファイルがアップロードされるのを認識して待機するのに十分なほど賢いです。誰かが私がここで間違っていることを見つけることができますか?

どうもありがとう。

古いもの:

Rails3とPaperclipを使用してフォトギャラリーアプリを開発しています。管理者は、ギャラリーを作成し、多数の画像を含むzipファイルをアップロードできます。

私がしたいこと:

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

私はこれをいくつかの異なる方法で機能させようとしました。

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

最近、コールバックメソッドを使ってみました。after_saveは、フォームPOSTを中断し、ファイルがアップロードされず、:extract_photosメソッドがファイルを見つけることができないため、機能しませんでした。

Paperclipgithubページでコールバックメソッドをチェックアウトしました。コールバックについて説明しています。

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

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

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

アップデート

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

4

1 に答える 1

2

これを実現するために、独自のプロセッサを作成できます。

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

  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

私はカスタムプロセッサを使用して、途中でファイルの多くの処理と変換を行っているのと同じようにしていますが、うまく機能しているようです。

于 2011-01-27T20:40:44.310 に答える