我已经在这个有一段时间了。使用这个RailsCast,我已经能够修改它以与 CarrierWave 一起使用——至少在理论上是这样。我试图允许用户裁剪他们的个人资料照片,然后使用 CarrierWave 将其上传到 S3。到目前为止,这是有效的:
- 用户上传图片及其其他个人资料信息
- 他们成功地被带到一个裁剪页面,在那里他们可以裁剪照片 - 照片被上传并且原始图像尺寸被成功捕获
- 单击“裁剪”以保存图像不会触发任何错误(模型保存得很好),但据我所知,实际上也不会裁剪或重新创建版本。
所以,这是我得到的代码。这是模型:
attr_accessor :crop_x, :crop_y, :crop_w, :crop_h, :original_width, :original_height
attr_accessible :avatar, :remove_avatar
after_update :reprocess_avatar, :if => :cropping?
mount_uploader :avatar, ProfileBaseUploader
def cropping?
!crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end
private
def reprocess_avatar
avatar.process!
avatar.recreate_versions!
end
漂亮的样板——crop_x 等属性是从裁剪视图分配的。我已经确认这些都被传入并正确分配,并且 reprocess_avatar 方法被调用。
这是我的上传代码:
include CarrierWave::MiniMagick
include CarrierWaveDirect::Uploader
storage :fog
require 'guid'
process :cropper
process :store_best_geometry
version :tiny_thumb do
process :resize_to_limit => [50, 50]
end
version :thumb do
process :resize_to_limit => [200, 200]
end
version :large do
process :resize_to_fit => [500, 500]
end
def extension_white_list
%w(jpg jpeg gif png)
end
def filename
@name ||= "#{secure_token}.#{file.extension}" if original_filename.present?
end
def store_best_geometry
manipulate! do |img|
if model
model.original_width = img['width']
model.original_height = img['height']
end
img = yield(img) if block_given?
img
end
end
def cropper
return unless model.cropping?
manipulate! do |img|
img = img.crop("#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}")
img
end
end
protected
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) or model.instance_variable_set(var, Guid.new)
end
我认为是过程!并重新创建版本!方法根本无法正常运行,但我不知道为什么。我没有任何可以提供的错误(如果有人知道我如何生成错误,我很乐意这样做)。我知道 store_best_geometry 方法效果很好。不能对cropper说同样的话。
有任何想法吗?