Rails Active Storage:如何创建 "named variants" 由用户提供的坐标裁剪

Rails Active Storage: How to create "named variants" that are cropped by user-supplied coordinates

我有类似的东西:

class User < ApplicationRecord

  has_one_attached :avatar do |attachable|
    attachable.variant :large,  resize_to_limit: [300, nil]
    attachable.variant :medium, resize_to_limit: [100, nil]
    attachable.variant :small,  resize_to_limit: [ 50, nil]
  end

end

我如何创建...

是否可以通过某种方式“将坐标传递给模型”?如果是,如何?

如果不是:裁剪是否需要在控制器操作中单独发生,创建一个裁剪版本(原始文件的),基于该版本创建“命名变体”?如果是这样,那看起来如何?

我会尽量回答你的问题:

  1. 我认为您不能像模型中的定义那样将参数传递给变体。您可以在方法中生成变体(在控制器中 - 在 before/after save/create 过滤器中)或在视图中使用:user.avatar.variant(:large)。如果在视图中完成,附加 .processed 以检索已经生成的变体(如果存在)。
  2. 要裁剪和调整大小,请添加:resize_to_limit: [300, 100], crop: '200x300+0+0'

如果你想从参数中获取尺寸和坐标,那么我不会使用命名变体,而是像

模型中: has_one_attached :avatar

在控制器中:

def image_height
  params[:height]
end

def generate_variant_small
  @user.avatar.variant(resize_to_limit: "300x#{image_height}^", crop: '200x300+0+0').processed
end
  1. 原始图像将保持不变。您上传原始图片,然后所有变体将被处理为新图片。