3

由于我是 Rails 新手,我犯了在 4 个不同模型中使用默认路径( /system/:attachment/:id/:style/:filename )的错误。现在,我想将每个模型移动到自己的文件夹中,但不会丢失旧数据。

处理这个的正确方法是什么?Paperclip 是否提供自动从旧文件夹迁移数据的选项?

谢谢。

4

2 回答 2

3

我也有类似的困境。我们将所有附件存储在特定路径中,然后业务需求发生变化,所有内容都必须移动和重新组织。

我很惊讶关于更改回形针路径和移动文件的信息很少。也许我错过了明显的?

费尔南多一样,我必须编写一个 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

于 2012-12-27T20:21:59.483 回答
2

我最终创建了一个小型 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 :)

于 2012-05-06T04:38:26.240 回答