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 中工作