更新已创建的Paperclip附件的路径

4

我曾经有一个有缺陷的Paperclip配置:

class Photo < ActiveRecord::Base

  has_attached_file :image, :storage => :s3,
                    :styles => { :medium => "600x600>", :small => "320x320>", :thumb => "100x100#" },
                    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                    :path => "/:style/:filename"
end

这是有缺陷的,因为两个图像不能具有相同的大小和文件名。为了解决这个问题,我将配置更改为:
class Photo < ActiveRecord::Base

  has_attached_file :image, :storage => :s3,
                    :styles => { :medium => "600x600>", :small => "320x320>", :thumb => "100x100#" },
                    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                    :path => "/:style/:id_:filename"
end

不幸的是,这将导致我已经创建的所有附件URL失效。 我该如何更新这些文件路径或以其他方式使URL正常工作?

2个回答

4
我最终使用 aws-s3 gem 手动完成了这个操作:
Photo.all.map{|p| [p.image.path(:thumb), "/thumb/#{p.id}_#{p.image_file_name}"]}.each do |p|
  if AWS::S3::S3Object.exists? p[0], bucket_name
    AWS::S3::S3Object.rename p[0], p[1], bucket_name
  end
end

(当然,我需要为每种附件样式重复这个过程。)

2
您可以在迁移或控制台中运行Photo.find_each { |photo| photo.image.reprocess! }
如果您安装了rake任务,也可以尝试运行rake paperclip:refresh CLASS=Photo。如果需要,请不要忘记设置RAILS_ENV。
如果您需要rake任务而没有它们,文件在这里,可以直接放入lib/tasks中。

5
这似乎是正确的方法,但它并不起作用。例如,假设一张图片旧的路径是"a/b.png",我想重新处理成"a/123_b.png"。由于我使用的:path => "/:style/:id_:filename",因此Paperclip会在"a/123_b.png"寻找附件以进行重新处理,结果我得到了一个AWS::S3::NoSuchKey错误。 - Tom Lehman
1
哦,我明白了,所以即使原始路径也会改变。在这种情况下,你必须手动完成,有点糟糕。 - x1a4
这个答案根本行不通,因为reprocess!取决于模型中路径的定义方式。原问题明确要求重新定义路径。 - Preacher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接