簡體   English   中英

Rails Active Storage:如何創建由用戶提供的坐標裁剪的“命名變體”

[英]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]
  • 同時保持上傳的(原始)文件不變?

是否有可能以某種方式“將坐標傳遞給模型”? 如果是,如何?

如果不是:是否需要在 controller 操作中單獨進行裁剪,創建一個裁剪版本(原始文件),基於該版本創建“命名變體”? 如果是這樣,那會是什么樣子?

我會試着回答你的問題:

  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. 原始圖像將保持不變。 您上傳原始圖像,然后所有變體都將作為新圖像處理。

這已添加到 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) %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM