3

Railsを初めて使用するため、4つの異なるモデルでデフォルトのパス(/ system /:attachment /:id /:style /:filename)を使用するのを間違えました。ここで、古いデータを失うことなく、各モデルを独自のフォルダーに移動したいと思います。

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

ありがとう。

4

2 に答える 2

3

同様のジレンマがありました。すべての添付ファイルを特定のパスに保存していたため、ビジネス要件が変更され、すべてを移動して再編成する必要がありました。

ペーパークリップのパスの変更やファイルの移動に関する情報がほとんどないことに驚いています。多分私は明白なものを逃していますか?

フェルナンドのように、私はレーキタスクを書かなければなりませんでした。私のコードは次のようになります(添付ファイルモデルはAttachmentであり、実際のP​​aperclip :: 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を使用しています

于 2012-12-27T20:21:59.483 に答える
2

私はこれを行うために小さなレーキタスクを作成することになりました。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を設定するようにします:)

于 2012-05-06T04:38:26.240 に答える