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

时间:2010-06-15 21:28:01

标签: ruby-on-rails attachment paperclip

我曾经有过这个有缺陷的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工作?

2 个答案:

答案 0 :(得分:3)

我最终使用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

(当然我必须为每种附件样式重复它)

答案 1 :(得分:2)

您可以从迁移中运行Photo.find_each { |photo| photo.image.reprocess! },甚至可以在控制台中运行。

您可能还安装了rake任务,具体取决于您安装回形针的方式。您可以尝试运行rake paperclip:refresh CLASS=Photo。如有必要,请不要忘记设置RAILS_ENV。

如果你想要rake任务但没有它们,那么该文件是here,可以直接删除到lib/tasks