Railsを初めて使用するため、4つの異なるモデルでデフォルトのパス(/ system /:attachment /:id /:style /:filename)を使用するのを間違えました。ここで、古いデータを失うことなく、各モデルを独自のフォルダーに移動したいと思います。
これを処理する適切な方法は何ですか?Paperclipには、古いフォルダからデータを自動的に移行するオプションがありますか?
ありがとう。
Railsを初めて使用するため、4つの異なるモデルでデフォルトのパス(/ system /:attachment /:id /:style /:filename)を使用するのを間違えました。ここで、古いデータを失うことなく、各モデルを独自のフォルダーに移動したいと思います。
これを処理する適切な方法は何ですか?Paperclipには、古いフォルダからデータを自動的に移行するオプションがありますか?
ありがとう。
同様のジレンマがありました。すべての添付ファイルを特定のパスに保存していたため、ビジネス要件が変更され、すべてを移動して再編成する必要がありました。
ペーパークリップのパスの変更やファイルの移動に関する情報がほとんどないことに驚いています。多分私は明白なものを逃していますか?
フェルナンドのように、私はレーキタスクを書かなければなりませんでした。私のコードは次のようになります(添付ファイルモデルはAttachmentであり、実際の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私はレール2.3.8ブランチにいて、ペーパークリップ-v2.8.0を使用しています
私はこれを行うために小さなレーキタスクを作成することになりました。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
それら、rakechange_users_folderを実行して待ちます。
これは古いファイルを削除しないことに注意してください。それらは元の場所に保持され、コピーが新しいフォルダに作成されます。すべてがうまくいった場合は、後で削除できます。
そして、将来のコードでは、ペーパークリップを使用するときに常に:pathと:urlを設定するようにします:)