我在我的新项目中使用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处理器访问的虚拟属性?谢谢
答案 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