1

我在我的新项目中使用 Paperclip gem 来存储图像。我还编写了一个简单的自定义回形针处理器,用于根据裁剪参数裁剪图像,存储在模型的虚拟属性中。

因此,客户端使用模型的实际数据库字段和crop_x、crop_y、crop_w、crop_h 属性传输表单,控制器基于“params”创建新实例——进展顺利——我检查了它,但随后发生了一些奇怪的事情。

这是我的模型:

class Jewel < ActiveRecord::Base
has_many :line_items
belongs_to :material

******* some code *********

before_save :debugmeBS

validates :category_id, :presence => true

attr_accessor   :crop_x, :crop_y, :crop_w, :crop_h
attr_accessible :name, :category_id, :price, :crop_x, :crop_y, 
:crop_w, :crop_h, :image

after_update :reprocess_image, :if => :need_to_crop?

has_attached_file :image, :styles => { :full => "900x", :smallthumb => "80x80>" }, 
:processors => [:cropper, :thumbnail]

before_post_process :debugmePP

def need_to_crop?
    # debugger
    !crop_x.blank? && !crop_y.blank? &&!crop_w.blank? &&!crop_h.blank?
end

private 
    def debugmeBS
        debugger
        x=2

    end

    def debugmePP
        debugger
        x=3

    end
 end

放置在我的自定义处理器中的调试器显示crop_x、crop_y 和其他虚拟属性为空白(通过调用“need_to_crop?”方法),同时其他非虚拟属性设置正确。为了追踪错误,我放置了两个“before_”事件:before_save 和 Paperclip 的 before_post_process。结果是 before_post_process 在 before_save 之前被调用,并且在我所有的“crop_”属性都是 nil 的那一刻,但是在 before_save 触发的那一刻,这些都被正确设置了。
所以问题是为什么?以及如何设置我的虚拟属性以供回形针处理器访问?谢谢

4

1 回答 1

3

我也碰到了同样的事情。查看 Paperclip 的代码(参见 lib/paperclip/ 下的 callbacks.rb、attachment.rb 和 paperclip.rb),似乎在将文件分配给属性时调用了 before_post_process 和 before__post_process 回调。我的猜测是,这是在设置模型上的其他属性之前发生的。

更新:我在 GitHub 问题上询问了 Paperclip 项目,我上面写的内容得到了证实。处理的时间取决于属性的分配时间。由于属性是按字母顺序分配的,根据 的名称,它可以在任何其他属性之前分配。

对于解决方法,您可以执行以下操作:

def create
  avatar = params[:resource].delete(:avatar)
  resource = Resource.new(params[:resource]
  resource.avatar = avatar
  resource save
end

来源:https ://github.com/thoughtbot/paperclip/issues/1279

于 2013-07-13T23:53:05.960 回答