Рубин: Скрепка, S3 и Глубокое клонирование - PullRequest
4 голосов
/ 25 июля 2010

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

Я пытался вызвать метод сохранения и создания 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

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

1 Ответ

1 голос
/ 25 июля 2010

Согласно этому прежнему вопросу / ответу , это должно быть возможно с этой простой строкой кода:

self.file = old_asset.file
...