Как отправить аргументы в процессор Paperclip

я пытаюсь понять, как отправить значение модели в пользовательский процессор Paperclip, и просто не могу понять, почему это так сложно или какое может быть решение, так как я пытаюсь решить это уже несколько дней ... Вот мой код, извлеченный как из моей модели, так и из процессора.

Из моей модели:

...
  has_attached_file :receipt_file,
                    :storage => :s3,
                    :s3_credentials => "#{Rails.root}/config/s3.yml",
                    :path => "/:style/:id/:filename",
                    :s3_protocol => "https",
                    :styles => { :text => { style: :original, receipt_id: self.id }},
                    processors: [:LearnProcessor]
...

Почему я не могу использовать "self.id" для получения идентификатора квитанции? Как получается, что "/:style/:id/:filename" преобразуется во что-то вроде /original/1/abc.pdf, и если я поставлю receipt_id: :id, все, что я получу из options[:receipt_id] (см. ниже), будет :id вместо 1?

Нужна ли мне какая-то интерполяция?

Код процессора

module Paperclip

    class LearnProcessor < Processor
      attr_accessor :receipt_id,:style


      def initialize(file, options = {}, attachment = nil)
        @file           = file
        @current_format = File.extname(@file.path)
        @basename       = File.basename(@file.path, @current_format)
        @style = options[:style]
        @receipt_id = options[:receipt_id]
        puts "Options #{options.inspect}"
      end
...

person MrWater    schedule 04.09.2012    source источник
comment
Почему бы вам не сохранить вложение в переменной экземпляра, как это сделано в геме?   -  person apneadiving    schedule 04.09.2012
comment
Кстати, URL-адрес фактически создается в процессе интерполяции.   -  person apneadiving    schedule 04.09.2012
comment
@apneadiving, что вы подразумеваете под сохранением вложения в переменной экземпляра? Где и как мне его сохранить? Где в геме он сохраняется?   -  person MrWater    schedule 04.09.2012
comment
См.: github.com/thoughtbot/paperclip/blob/ мастер/библиотека/скрепка/   -  person apneadiving    schedule 04.09.2012
comment
Это определенно было преимуществом, и теперь я использую attachment.path. Кажется, что моего идентификатора нет в пути, хотя я отправляю его в качестве аргумента... Знаете ли вы, как я могу распечатать входящие переменные в процессоре в файл журнала? (logger, log и puts, похоже, не работают)   -  person MrWater    schedule 04.09.2012
comment
Мне только что удалось выполнить отладку с помощью Rails.logger.debug, но просто чтобы увидеть, что идентификатора там нет... я получаю original//filename.pdf   -  person MrWater    schedule 04.09.2012
comment
Каков ваш точный ожидаемый результат?   -  person apneadiving    schedule 04.09.2012
comment
Я ожидал, что у меня будет original/1/filename.pdf, где 1 — ИД_квитанции.   -  person MrWater    schedule 04.09.2012


Ответы (2)


Я не знаю, является ли это конкретной проблемой Paperclip, но есть проблема Ruby, которую я могу решить. Ruby позволяет вам вызывать методы класса в ваших определениях классов, которые предоставляют интуитивно понятные DSL, подобные этому здесь:

class MyModel < ActiveRecord::Base
  has_attached_file :receipt_file
end

Проблема в том, что вы ожидаете ссылаться на id модели при вызове этого метода класса, но id доступен только для экземпляров класса. Так что это не сработает. Обычно такие вещи выполняются с использованием блока, который оценивается во время выполнения, как только экземпляр становится доступным.

has_attached_file :receipt_file,
                    # ...
                    :styles => { :text => { style: :original, receipt_id: lambda{self.id} }},

Однако Paperclip должен знать, как принимать и вызывать блок, и я не уверен, что это так. Вероятно, есть другой способ добиться того, что вы пытаетесь сделать, и я не уверен, что это такое, но, надеюсь, это поможет.

person Andrew    schedule 18.04.2014

Добавьте это в инициализатор:

module Paperclip
  module Interpolations
    def receipt_id attachment = nil, style_name = nil
      #you should handle the case when attachment and style_name are actually nil
      attachment.instance.receipt_id
    end
  end
end

Тогда у вас может быть такой путь:

:path => "/:style/:receipt_id/:filename",
person apneadiving    schedule 04.09.2012
comment
Я не понимаю... зачем мне в пути нужно получение_идентификатора? Моя модель уже является квитанцией, и у меня есть путь :path => "/:style/:id/:filename"... Мой экземпляр не имеет квитанции_id... - person MrWater; 05.09.2012
comment
Я заметил, что id уже интерполирован в файле interpolations.rb def id attachment, style_name attachment.instance.id end Так почему же он не заполняется, когда я вызываю attachment.path на своем процессоре? - person MrWater; 05.09.2012
comment
Да, id уже находится в интерполяторе, поэтому ваш путь должен быть в порядке. Что вам нужно от вашего процессора? - person apneadiving; 05.09.2012
comment
хорошо, у меня есть код для вставки цифровой подписи в файл PDF (проверьте версию 2 этого кода здесь: stackoverflow.com/questions/12078006/, и хотел бы сделать это в своем процессоре. для этого я в основном хочу сохранить файл во временный каталог, где создается новый файл с подписью, а затем загружается на сервер.В идеале, я бы даже сделал это асинхронно, с delay_paperclip. - person MrWater; 05.09.2012
comment
Может я не так думаю? Мне удалось добавить цифровую подпись к файлу, но теперь я не могу отправить файл по нужному адресу. Я получаю сообщение об ошибке Receipt file No handler found for <AWS::S3::S3Object:mybucket/original//Sample_signed.pdf>, но файл загружается в пустую папку имени внутри исходной папки. - person MrWater; 06.09.2012