基于列值使用 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
这是一个例子:
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