J'ai rencontré ce même problème plusieurs fois. La façon dont je l'ai résolu était en créant 2 modèles, un modèle Image
et un modèle TempImage
, qui hérite du modèle Image
. Cela vous oblige à avoir une colonne type
sur votre table Image
. Le modèle TempImage
enregistre l'image localement, puis lorsque vous y accédez directement à partir du modèle Image
et que vous le réenregistrez, il suit tout ce qui est défini dans le modèle Image
, à savoir Amazon S3.
Exemple:
# Will save in the database as a TempImage inside the Image table
temp = TempImage.create(:asset => File.new('some_path', 'r'))
# When you find it again through the Image model, it bypasses the type column
# so next time you save it, it is saved as an Image.
amazon = Image.find(temp.id)
amazon.save!
Voici mon travail retardé:
class MoveToS3Job < Struct.new(:temp_revision_id)
def perform
upload = Image.find(temp_revision_id)
temp_path = File.expand_path("tmp/uploads/#{upload.asset_file_name}", Rails.root)
upload.asset = File.new(temp_path, 'r')
upload.save!
if File.exists?(temp_path) && !File.directory?(temp_path)
File.delete(temp_path)
end
rescue ActiveRecord::RecordNotFound
# If the record wasn't found, do some sort of
# error report, but don't keep it in the queue.
end
end
Voici le modèle TempImage
:
class TempImage < Image
has_attached_file :asset, {
:path => ":rails_root/tmp/uploads/:basename_:updated_at.:extension"
}
end
Ensuite, le modèle Image
d'origine:
class Image < ActiveRecord::Base
# Validations
validates :asset, :presence => true
# Paperclip
has_attached_file :asset, :styles => {
:preview => ['100x100#', :png],
:thumb => ['50x50#', :png]
},
:default_style => :thumb,
:storage => :s3,
:bucket => 'bucket-name',
:s3_credentials => File.expand_path('config/s3.yml', Rails.root),
:path => "photos/:id_partition/:style.:extension"
end
Votre modèle original Image
doit toujours contenir votre post-traitement, car cela sera fait en arrière-plan.
Vous pouvez toujours remplacer certaines méthodes pour le rendre un peu plus propre, mais cela vous donne une meilleure idée de la façon dont il fonctionne et ce que vous devez faire pour que vous puissiez le faire fonctionner comme vous le souhaitez.