Rails Active Storage:如何创建由用户提供的坐标裁剪的“命名变体”

问题描述 投票:0回答:3

我有类似的东西:

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]
  • 同时保持上传的(原始)文件不变?

是否可以以某种方式“将坐标传递给模型”?如果是的话,怎么办?

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

ruby-on-rails rails-activestorage variant
3个回答
3
投票

这已添加到 Rails 7 中 (https://github.com/rails/rails/pull/39135):

class User < ActiveRecord::Base
  has_one_attached :avatar, variants: {
    thumb: { resize: "100x100" },
    medium: { resize: "300x300", monochrome: true }
  }
end

class Gallery < ActiveRecord::Base
  has_many_attached :photos, variants: {
    thumb: { resize: "100x100" },
    medium: { resize: "300x300", monochrome: true }
  }
end

<%= image_tag user.avatar.variant(:thumb) %>

0
投票

我会尽力回答你的问题:

  1. 我不认为您可以像模型中的定义那样将参数传递给变体。您可以使用以下方法在方法中(在控制器中 - 在保存/创建过滤器之前/之后)或在视图中生成变体:
    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. 原始图像将保持不变。您上传原始图像,然后所有变体将被处理为新图像。

0
投票

使用新语法:

图像魔法

  has_one_attached :image do |blob|
    blob.variant :small, resize: "720x400"
  end

贵宾

  has_one_attached :image do |blob|
    blob.variant :small, resize_to_limit: [720, 400]
  end
© www.soinside.com 2019 - 2024. All rights reserved.