4

我正在尝试了解如何将模型值发送到 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”来获取收据 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
...
4

2 回答 2

1

我不知道这是否是特定于回形针的问题,但我可以解决一个 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 需要知道如何接受和调用该块,我不确定它是否可以。可能有一种不同的方法可以实现您想要做的事情,我不确定那是什么,但希望这会有所帮助。

于 2014-04-18T16:20:32.353 回答
0

在初始化程序中添加:

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",
于 2012-09-04T18:20:14.007 回答