Paperclip的后期处理在虚拟属性获取值之前开始?

时间:2012-09-20 08:15:00

标签: ruby-on-rails paperclip before-filter

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

所以客户端传输形式与模型的实际数据库字段和crop_x,crop_y,crop_w,crop_h属性,控制器基于“参数”创建新实例 - 这很顺利 - 我检查了它,但后来有些奇怪的事情正在进行的地方。

这是我的模特:

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_save之前调用before_post_process,并且当我的所有“crop_”属性都为零时,但是在before_save触发的那一刻,这些都是正确设置的。
所以问题是为什么?以及如何设置Paperclip处理器访问的虚拟属性?谢谢

1 个答案:

答案 0 :(得分:3)

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

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

要获得解决方法,您可以执行以下操作:

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