Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ActiveStorage中使用variant选项后保存图像副本。_Ruby On Rails_Rails Activestorage - Fatal编程技术网

Ruby on rails 如何在ActiveStorage中使用variant选项后保存图像副本。

Ruby on rails 如何在ActiveStorage中使用variant选项后保存图像副本。,ruby-on-rails,rails-activestorage,Ruby On Rails,Rails Activestorage,我在使用ActiveStorage时遇到了这个问题,我需要处理一个图像,我的要求是保存处理后的图像,并在裁剪和其他转换后将其附加到新模型上。ActiveStorage::Blob#variant适应不同的用例,因此直接处理。以下假定为最新的Rails master,而不是Rails 5.2: variation = ActiveStorage::Variation.new(resize_to_fit: [100, 100], crop: true) message.header_image.o

我在使用ActiveStorage时遇到了这个问题,我需要处理一个图像,我的要求是保存处理后的图像,并在裁剪和其他转换后将其附加到新模型上。

ActiveStorage::Blob#variant
适应不同的用例,因此直接处理。以下假定为最新的Rails master,而不是Rails 5.2:

variation = ActiveStorage::Variation.new(resize_to_fit: [100, 100], crop: true)

message.header_image.open do |input|
  variation.transform(input, format: "png") do |output|
    message.cropped_header_image.attach \
      io: output,
      filename: "#{message.header_image.filename.base}.png",
      content_type: "image/png"
  end
end

@George有一个很好的答案,但我还是要提到我的答案,根据我对您问题的理解,它应该与rails 5.2一起工作

创建一个临时文件,然后首先获取该文件,如果它在您的云存储中,如果不在,那么您不需要这个部分,在这种情况下,只需使用blob获取路径即可

path = Rails.root.join('tmp', ModelVariable.main_image.blob.filename.to_s).to_s
File.open(path, 'wb') do |file|
  file.write(ModelVariable.main_image.blob.download)
end
进行定制

customize_image = MiniMagick::Image.open(path)
customize_image.crop(crop_params)
将其附加到所需的不同型号

file = File.open(customize_image.path)
filename = Time.zone.now.strftime("%Y%m%d%H%M%S") + ModelVariable.main_image.blob.filename.to_s
NewModelVaribale.customized_image.attach(io: file, filename: filename)
省省吧

customized_product.save

希望这对你有用:)

我想把它添加到法赞的答案中

如果您在本地存储,请使用

path = ActiveStorage::Blob.service.send(:path_for, ModelVariable.main_image.blob.key)

如何使用x坐标y坐标作为起点以及从那里开始的宽度和高度进行裁剪?或者使用x1、y1和x2,y2@GeorgeClaghorn您能提供您正在调用的方法的参考吗?我不记得附件上有任何
open
方法,调用该方法会抛出一个私有方法error@SampsonCrowley:它位于Rails master中,将在Rails 6中释放。你好,法赞!我使用了自定义版本的代码,这对我很有帮助。我可以用剪切版本替换附加的原始文件,而不是为剪切版本附加第二个文件。我的问题是:是否可以在没有临时文件(在tmp文件夹中)的情况下管理所有裁剪,所以我想是在内存中?由于版本
6.0.3.4
,path_for是一个公共实例方法,因此可以使用
send
直接调用。