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
我如何创建...
- 此类“命名变体”
- (首先)由用户提供的坐标裁剪,例如:
[x, y, width, height]
- 同时保持上传的(原始)文件不变?
是否可以通过某种方式“将坐标传递给模型”?如果是,如何?
如果不是:裁剪是否需要在控制器操作中单独发生,创建一个裁剪版本(原始文件的),基于该版本创建“命名变体”?如果是这样,那看起来如何?
我会尽量回答你的问题:
- 我认为您不能像模型中的定义那样将参数传递给变体。您可以在方法中生成变体(在控制器中 - 在 before/after save/create 过滤器中)或在视图中使用:
user.avatar.variant(:large)
。如果在视图中完成,附加 .processed
以检索已经生成的变体(如果存在)。
- 要裁剪和调整大小,请添加:
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
- 原始图像将保持不变。您上传原始图片,然后所有变体将被处理为新图片。
我有类似的东西:
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
我如何创建...
- 此类“命名变体”
- (首先)由用户提供的坐标裁剪,例如:
[x, y, width, height]
- 同时保持上传的(原始)文件不变?
是否可以通过某种方式“将坐标传递给模型”?如果是,如何?
如果不是:裁剪是否需要在控制器操作中单独发生,创建一个裁剪版本(原始文件的),基于该版本创建“命名变体”?如果是这样,那看起来如何?
我会尽量回答你的问题:
- 我认为您不能像模型中的定义那样将参数传递给变体。您可以在方法中生成变体(在控制器中 - 在 before/after save/create 过滤器中)或在视图中使用:
user.avatar.variant(:large)
。如果在视图中完成,附加.processed
以检索已经生成的变体(如果存在)。 - 要裁剪和调整大小,请添加:
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
- 原始图像将保持不变。您上传原始图片,然后所有变体将被处理为新图片。