如何将参数发送到Paperclip处理器

5
我是一个有用的助手,会翻译文本。

我正在尝试理解如何将模型值发送到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
...

为什么不像 gem 中那样将附件保存到实例变量中呢? - apneadiving
顺便说一下,URL实际上是在插值过程中构建的。 - apneadiving
@apneadiving,"将附件保存在实例变量中"是什么意思?我应该在哪里以及如何保存它?它在 gem 中的哪个位置被保存了? - MrWater
1
请参见:https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/processor.rb#L26 - apneadiving
这绝对是一个良好的开端,我现在正在使用attachment.path。不过似乎我的id不在路径上,尽管我将其作为参数发送了...你知道我如何将传入的变量打印到处理器的日志文件中吗?(logger、log和puts似乎都不起作用) - MrWater
显示剩余3条评论
2个回答

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需要知道如何接受和调用代码块,我不确定它是否能够做到。可能有其他方法可以实现您试图做的事情,但我不确定是什么方法,希望这可以帮助到您。


1

将此代码添加到初始化程序中:

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",

我不明白...为什么路径中需要“receipt_id”?我的模型已经是Receipt了,而且我的路径是 :path => "/:style/:id/:filename" ...我的实例没有receipt_id... - MrWater
我注意到在interpolations.rb中已经插值了iddef id attachment, style_name attachment.instance.id end 那么当我在处理器上调用attachment.path时,为什么它没有被填充? - MrWater
жҳҜзҡ„пјҢidе·Із»ҸеңЁеҶ…жҸ’еҷЁдёӯдәҶпјҢжүҖд»ҘдҪ зҡ„и·Ҝеҫ„еә”иҜҘжІЎй—®йўҳгҖӮдҪ зҡ„еӨ„зҗҶеҷЁйңҖиҰҒд»Җд№Ҳпјҹ - apneadiving
好的,我已经编写了将数字签名插入PDF文件的代码(请在此处检查该代码的第2版:https://dev59.com/UGct5IYBdhLWcg3wc9Ig),并希望在我的处理器中执行此操作。为此,我基本上想将文件存储到临时目录中,在其中生成带有签名的新文件,然后将其上传到服务器。理想情况下,我甚至会使用delay_paperclip异步执行此操作。 - MrWater
也许我没有想对?我已经成功将数字签名添加到文件中,但现在,我无法将文件发送到正确的目标位置。我收到了一个“Receipt file No handler found for AWS::S3::S3Object:mybucket/original//Sample_signed.pdf”错误,但该文件正在上传到原始文件夹内一个空名称的文件夹中。 - MrWater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接