2010-07-25 4 views
4

У меня есть модель темы, которая содержит много активов. Активы используют Paperclip и сохраняют их содержимое в моей системе Amazon AWS-S3. Я также использую deep_clone, потому что мои клиенты имеют возможность копировать встроенные темы, а затем изменять их в своем сердце. Весь материал deep_clone отлично работает, но когда я глубоко разбираюсь в активах, содержимое старого файла не добавляется в мои ведра S3. Запись сохраняется в базе данных, но поскольку содержимое файла не сохраняется с новым идентификатором, свойство file.url указывает на мертвый файл.Ruby: Paperclip, S3 и глубокое клонирование

Я попытался вызвать метод сохранения и создания paperclip вручную, но я не могу понять, как заставить paperclip «нажимать» файл обратно в ведро, так как теперь у него есть новый идентификатор и т. Д.

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 

Любые идеи о том, как я могу получить скрепку, чтобы нажать файл? Я также не возражаю против этого, используя жемчужину Amason aws-s3, но, похоже, я не мог заставить это работать.

ответ

Смежные вопросы