Rails Carrierwave和Imagemagick,使用条件调整图像大小
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails Carrierwave和Imagemagick,使用条件调整图像大小相关的知识,希望对你有一定的参考价值。
我一直在努力寻找任何教程或问题来解释如何根据用户提供的某些条件上传图像并调整其大小。
我可以使用硬编码值轻松上传和调整图像大小,但是我仍然坚持使用用户提供的参数从上传器访问。
我希望根据用户是将图像检查为大还是小来将图像的大小调整为800x600或300x300。
为此,我在模型结构中有一个名为“large”的布尔列。
在上传器中,我能够在store_dir块中轻松访问模型及其值,但是在此块之外的任何地方,任何模型属性都返回为nil。
这就是我想要做的: -
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
resize_to_fit(800,600) if model.large==true
resize_to_fit(300,300) if model.large!=true
end
但是,这会为BannerUploader:Class返回错误未定义的局部变量或方法`model'
如何解决这个问题。
要处理原始文件,您可以指定自定义方法:
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
process :process_original_version
def process_original_version
if model.large
resize_to_fit(800,600)
else
resize_to_fit(300,300)
end
end
end
对于特定版本:
class BannerUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :normal do
if model.large
process resize_to_fit: [800,600]
else
process resize_to_fit: [300,300]
end
end
end
好的,@ Alex Kojin有正确的答案。但是我也遇到了另一个问题。当用户提交表单时,图像将始终调整为小(300x300),因为由于某种原因,首先执行图像调整大小过程,然后将“大”属性设置为true。因此,上传器总是将model.large设为false。所以这就是我必须改变动作控制器的方法
def create
@banner=Banner.new
@banner.large=params[:large]
@banner.update_attributes(banner_params)
@banner.save
redirect_to :back
end
不确定这是否是正确的方法,但对我有用。
以上是关于Rails Carrierwave和Imagemagick,使用条件调整图像大小的主要内容,如果未能解决你的问题,请参考以下文章
Rails carrierwave 和 cloudinary 多文件上传
rails + WebRTC 录音 + Carrierwave + 雾 + S3 + Ajax 错误
使用Cloudinary,Carrierwave,Ckeditor和Rails Admin时出现问题
使用 React、Ruby on rails 5 和 CarrierWave 多次上传文件
Rails 4: Carrierwave/AWS - Excon::Errors::SocketError / getaddrinfo: nodename or servname provided
Rails:上传 dropzone、S3、carrierwave,不能在 Safari 中工作,但在 Google Chrome 中工作