由于我是 Rails 新手,我犯了在 4 个不同模型中使用默认路径( /system/:attachment/:id/:style/:filename )的错误。现在,我想将每个模型移动到自己的文件夹中,但不会丢失旧数据。
处理这个的正确方法是什么?Paperclip 是否提供自动从旧文件夹迁移数据的选项?
谢谢。
由于我是 Rails 新手,我犯了在 4 个不同模型中使用默认路径( /system/:attachment/:id/:style/:filename )的错误。现在,我想将每个模型移动到自己的文件夹中,但不会丢失旧数据。
处理这个的正确方法是什么?Paperclip 是否提供自动从旧文件夹迁移数据的选项?
谢谢。
我也有类似的困境。我们将所有附件存储在特定路径中,然后业务需求发生变化,所有内容都必须移动和重新组织。
我很惊讶关于更改回形针路径和移动文件的信息很少。也许我错过了明显的?
像费尔南多一样,我必须编写一个 rake 任务。这是我的代码的样子(附件模型是附件,实际的 Paperclip::Attachment 对象是 :file )
task :move_attachments_to_institution_folders => :environment do
attachments = Attachment.all
puts "== FOUND #{attachments.size} ATTACHMENTS =="
old_path_interpolation = APP_CONFIG[ 'paperclip_attachment_root' ] + "/:id_partition.:extension"
new_path_interpolation = APP_CONFIG[ 'paperclip_attachment_root' ] + "/:institution/reports/:id_:filename"
attachments.each do |attachment|
# the interpolate method of paperclip takes the symbol variables and evaluates them to proper path segments.
old_file_path = Paperclip::Interpolations.interpolate(old_path_interpolation, attachment.file, attachment.file.default_style) #see paperclip docs
puts "== Current file path: #{old_file_path}"
new_file_path = Paperclip::Interpolations.interpolate(new_path_interpolation, attachment.file, attachment.file.default_style)
if File.exists?(old_file_path)
if !File.exists?(new_file_path) #don't overwrite
FileUtils.mkdir_p(File.dirname(new_file_path)) #create folder if it doesn't exist
FileUtils.cp(old_file_path, new_file_path)
puts "==== File copied (^_^)"
else
puts "==== File already exists in new location."
end
else
puts "==== ! Real File Not Found ! "
end
end
对我来说关键是让回形针使用其默认插值重新计算旧路径。从那时起,只需使用标准 FileUtils 复制文件即可。副本负责重命名。
PS我在rails 2.3.8分支上,带有回形针-v 2.8.0
我最终创建了一个小型 rake 任务来执行此操作。假设您有一个名为 User 的模型,并且您的图像文件名为“image”,请将以下代码放在 lib/tasks/change_users_folder.rb
desc "Change users folder"
task :change_users_folder => :environment do
@users = User.find :all
@users.each do |user|
unless user.image_file_name.blank?
filename = Rails.root.join('public', 'system', 'images', user.id.to_s, 'original', user.image_file_name)
if File.exists? filename
user.image = File.new filename
user.save
end
end
end
end
他们,运行rake change_users_folder并等待。
请注意,这不会删除旧文件。它们将保留在原始位置,并在新文件夹中创建一个副本。如果一切顺利,您可以稍后删除它们。
对于我未来的代码,我将确保在使用回形针时始终设置 :path 和 :url :)