Ce que j'ai est un modèle de thème, qui contient de nombreux actifs. Les actifs utilisent Paperclip et stockent leur contenu dans mon système Amazon AWS-S3. J'utilise aussi deep_clone parce que mes clients ont la possibilité de copier des thèmes intégrés, puis de les modifier en fonction de leur contenu. Tous les trucs deep_clone fonctionnent très bien, mais quand je clique en profondeur sur les assets, l'ancien contenu du fichier n'est pas ajouté à mes buckets S3. L'enregistrement est enregistré dans la base de données, mais comme le contenu du fichier n'est pas enregistré avec le nouvel ID, la propriété file.url pointe vers un fichier mort.Ruby: Paperclip, S3, et clonage en profondeur
J'ai essayé d'appeler manuellement la méthode save et create de paperclip, mais je n'arrive pas à comprendre comment amener le trombone à "repousser" le fichier dans le seau puisqu'il a maintenant un nouvel ID, etc ....
require 'open-uri'
class Asset < ActiveRecord::Base
belongs_to :theme
attr_accessor :old_id
has_attached_file :file,
:storage => "s3",
:s3_credentials => YAML.load_file("#{RAILS_ROOT}/config/aws.yml")[RAILS_ENV],
:bucket => "flavorpulse-" + RAILS_ENV,
:path => ":class/:id/:style.:extension"
validates_attachment_presence :file
validates_attachment_size :file, :less_than => 5.megabytes
before_save :delete_assets_in_same_theme_with_same_name
after_create :copy_from_cloned_asset
private
def delete_assets_in_same_theme_with_same_name
Asset.destroy_all({:theme_id => self.theme_id, :file_file_name => self.file_file_name})
end
def copy_from_cloned_asset
if (!old_id.blank?)
if (old_id > 0)
old_asset = Asset.find(old_id)
if (!old_asset.blank?)
self.file = do_download_remote_image(old_asset.file.url)
self.file.save
end
end
end
end
def do_download_remote_image (image_url)
io = open(URI.parse(image_url))
def io.original_filename; base_uri.path.split('/').last; end
io.original_filename.blank? ? nil : io
rescue # catch url errors with validations instead of exceptions (Errno::ENOENT, OpenURI::HTTPError, etc...)
end
end
Toutes les idées sur la façon dont je peux obtenir paperclip pour pousser le fichier? Je ne serais pas opposé non plus à faire cela en utilisant la gemme aws-s3 d'Amazon, mais je n'arrive pas à faire fonctionner ça non plus.