【问题标题】:How to access ActiveStorage tempfile in Rails model?如何在 Rails 模型中访问 ActiveStorage 临时文件?
【发布时间】:2020-05-31 18:42:26
【问题描述】:

我正在尝试在使用 Rails 的ActiveStorage 上传图片之前调整其大小。以下控制器操作就像一个魅力:

class CatsController < ApplicationController

  require 'mini_magick'

  def create
    @cat = current_user.cats.new(cat_params)

    params[:cat][:images].each do |image|
      mini_image = MiniMagick::Image.new(image.tempfile.path)
      mini_image.resize '1200x1200'
    end

    if @cat.save
      ...
    end
  end

end

但我想让我的控制器保持精简并将这个功能移到模型中。但是当我这样做时,Rails 在模型中找不到tempfile

模型中根本就没有办法访问tempfile吗?

感谢您的帮助。

【问题讨论】:

  • 你可以发布你的模型方法,那是试图移动吗?
  • 我花了几个小时寻找一种在上传时调整图像大小的方法。这个解决方案终于救了我。它无需任何修改即可工作(Rails 6)。

标签: ruby-on-rails temporary-files rails-activestorage minimagick


【解决方案1】:

或者你可以创建一个服务

# app/services/image_resizer.rb

class ImageResizer
  def self.call(images, size)
    Array(images).each do |image|
      i = MiniMagick::Image.new(image.tempfile.path)
      i.resize size
    end
  end
end

def create
  @cat = current_user.cats.new(cat_params)
  ImageResizer.call(params[:cat][:images], '1200x1200')

  if @cat.save
    ...
  end
end

【讨论】:

  • 不完美,但它将我的控制器代码减少到一行。所以这就是我最终做的。谢谢!
  • 或者你可以将整个params.eachsection 移动到一个助手中,所以在你的控制器中你只需要my_resize_function(params),左右。请记住在控制器中包含帮助程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2019-10-23
相关资源
最近更新 更多