我上传了一张按预期工作的图片,除非我向 ImageUploader 添加了一个额外的进程 (auto_orient)。代码如下:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
retina!
if Rails.env.development?
def store_dir
"#{Rails.root}/public/uploads/account_#{model.account_id}/product_#{model.product_id}/image_#{model.id}"
end
elsif Rails.env.staging? || Rails.env.production?
def store_dir
"uploads/account_#{model.account_id}/product_#{model.product_id}/image_#{model.id}"
end
end
def default_url
"/assets/no_image_500px.png"
end
process :auto_orient
process :resize_and_pad => [500, 500]
version :thumb_100 do
process :resize_and_pad => [100, 100]
end
version :shopping_cart do
process :resize_to_fill => [200, 200]
process :retina_quality => 100
end
version :store_page do
process :resize_to_fill => [336, 336]
process :retina_quality => 100
end
version :product_page do
process :resize_to_fill => [426, 426]
process :retina_quality => 100
end
def extension_white_list
%w(jpg jpeg png tiff)
end
def auto_orient
manipulate! do |img|
img = img.auto_orient
end
end
end
Auto_orient 服务于用户从他们的手机上传图片的目的,图片是自动定向的。此当前代码适用于移动上传的图像,但是当我尝试从桌面上的 Web 应用程序上传图像时,我收到:“未定义的方法‘销毁!’对于 true:TrueClass"。
我看过 documentation对于 minimagick 和想法将 auto_orient 更改为 auto_orient!但后来我被告知 minimagick 没有名为 auto_orient 的方法!为什么用这种方法调用 destroy ?
看起来像是在操纵!在 auto_orient 返回时调用 destroy 方法(它最终是一个 bool 值 (true))。因此无法在 bool 值上调用 delete 的错误。为了解决这个问题,我添加了 ruby 的“tap”方法以将图像传递给 block ,然后立即返回图像:
def auto_orient
manipulate! do |img|
img.tap(&:auto_orient)
end
end
我是一名优秀的程序员,十分优秀!