基于列值使用 carrierwave 创建不同的图像版本

Create different image versions with carrierwave based on a column value

这是一个例子:

app/models/book.rb

class Advertisement < ActiveRecord::Base

  enum kind: { magazine: 0, newspaper: 1 }
  mount_uploader :main_pic, BookMainPicUploader

  # ...

end

app/uploaders/book_main_pic_uploader.rb

class BookMainPicUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :fog

  def store_dir
    "uploads/featured/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  version :normal do
    process resize_to_fill: [800, 400]
  end

  version :square do
    process resize_to_fill: [400, 400]
  end

end

以上代码将为每种书籍创建普通版和方形版,但我们只想为杂志生成普通版,仅为报纸生成方形版。

是否可以实现?

您需要将 if 条件选项传递给 version 方法。

class BookMainPicUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :fog

  def store_dir
    "uploads/featured/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  version :normal, if: :is_magazine? do
    process resize_to_fill: [800, 400]
  end

  version :square, if: :is_newspaper? do
    process resize_to_fill: [400, 400]
  end

  private

  def is_magazine? picture
    model.magazine?
  end

  def is_newspaper? picture
    model.newspaper?
  end

end