Ruby on rails 更新已创建的回形针附件的路径

Ruby on rails 更新已创建的回形针附件的路径,ruby-on-rails,attachment,paperclip,Ruby On Rails,Attachment,Paperclip,我以前有一辆四轮马车的回形针配置: class Photo < ActiveRecord::Base has_attached_file :image, :storage => :s3, :styles => { :medium => "600x600>", :small => "320x320>", :thumb => "100x100#" }, :s3_cre

我以前有一辆四轮马车的回形针配置:

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:s3,
:style=>{:medium=>“600x600>”,:small=>“320x320>”,:thumb=>“100x100#”},
:s3_credentials=>“#{RAILS_ROOT}/config/s3.yml”,
:path=>“/:style/:filename”
结束
这是错误的,因为两个图像不能具有相同的大小和文件名。为了解决这个问题,我将配置更改为:

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
class-Photo:s3,
:style=>{:medium=>“600x600>”,:small=>“320x320>”,:thumb=>“100x100#”},
:s3_credentials=>“#{RAILS_ROOT}/config/s3.yml”,
:path=>“/:style/:id\uu:filename”
结束

不幸的是,这会破坏我已经创建的所有附件的URL。如何更新这些文件路径或以其他方式使URL工作?

您可以通过迁移运行
Photo.find_each{Photo | Photo.image.reprocess!}
,甚至在控制台内运行

您可能已经安装了一个rake任务来完成这项工作,具体取决于您安装回形针的方式。您可以尝试运行
rake-paperclip:refresh CLASS=Photo
。如有必要,不要忘记设置RAILS_ENV


如果您想要rake任务,但没有,则该文件是,并且可以直接放入
lib/tasks
中。最后,我使用
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

(当然,我必须为每种附件样式重复此操作)

这似乎是正确的方法,但不起作用。例如,假设一个图像的旧路径是“a/b.png”,我想将其重新处理为“a/123_b.png”。因为我有
:path=>“/:style/:id\uu:filename”
,所以回形针在“a/123_b.png”处寻找附件进行重新处理,我得到了一个
AWS::S3::NoSuchKey
错误哦,我明白了,所以即使原始路径也会改变。在这种情况下,你必须手工操作,这是一个很糟糕的问题。这个答案根本不起作用,因为
重新处理取决于路径在模型中的定义方式。最初的问题是问如何重新定义路径。