2010-07-25 8 views
4

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.

Répondre

Questions connexes