2012-05-05 6 views
3

私はRailsを使い慣れていないので、デフォルトパス(/ system /:attachment /:id /:style /:filename)を4つの異なるモデル。今、私は自分のフォルダに古いデータを失うことなく各モデルを移動したいと思います。Rails 3 + Paperclip:現在のデータを別のフォルダに移動

これを適切に処理する方法は何ですか? Paperclipは古いフォルダから自動的にデータを移行するオプションを提供していますか?

ありがとうございました。

+1

モデルのIDに基づいて手動でファイルを移動するためのスクリプトを作成する必要があるようです。 –

答えて

2

私はこのために小さなレーキタスクを作成しました。あなたがモデルと呼ばれるユーザーを持っているし、あなたのイメージファイルは、「画像」と呼ばれていると仮定すると、すくいchange_users_folderを実行して、待って、LIB /タスク/ 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 

それらを次のコードを配置します。

古いファイルは削除されません。それらは元の場所に保持され、新しいフォルダにコピーが作成されます。すべてがうまくいったら、後で削除することができます。

そして、私の将来のコードのために、私は確信して私は常にセットになります:パスと:ペーパークリップを使用している場合、URLを:)

3

私は同様のジレンマを持っていました。私たちはすべての添付ファイルを特定のパスに格納していましたが、ビジネス要件が変更され、すべてを移動して再構成する必要がありました。

私は、ペーパークリップのパスを変更したり、ファイルを移動したりする際に、少しの情報がどれほどあるのか驚いています。たぶん私は明白なことを見逃している?

Fernandoのように、私はレーキタスクを書く必要がありました。ここで(添付モデルが添付ファイル、および実際のペーパークリップです::添付ファイルオブジェクトは次のとおりです。ファイル)私のコードは次のようになります。

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を使用してファイルをコピーするだけでした。コピーは名前の変更を処理します。

P.S. 私はレール上にあります。2.3.8ブランチ、paperclip -v 2.8.0

関連する問題