Не удается скопировать изображения с помощью скрепки Paperclip, используя image.to_file для изображений S3 - PullRequest
2 голосов
/ 23 ноября 2010

У меня проблема, которая влияет только на это приложение в производственной среде.У нас есть одно действие контроллера, которое используется для «клонирования» объектов статьи, создавая новый объект, устанавливая атрибуты равными друг другу, а затем добавляя изображения к объекту.

Вот часть контроллерачто делает это:

def clone_article
 ba = BlogArticle.find(params[:id])
 new_ba = BlogArticle.new(ba.attributes)

 ba.blog_article_images.each do |blog_img|
   new_ba.blog_article_images.build(:image => blog_img.image.to_file, :embedded => blog_img.embedded?)
 end

 new_ba.status = 'draft'
 new_ba.title = "Copy of #{ba.title}"

 if new_ba.save
     flash[:notice] = "Clone successful"
 else
    if new_ba.errors.empty?
        flash[:notice] = "Unknown error occurred while cloning the post"
    else
        error = 'Problem while cloning the post: <br>'
        new_ba.errors.each {|field, msg| error += field + " " + msg + "<br>"}
        flash[:error] = error
    end
 end
redirect_to admin_blog_articles_url

end

Проблема в том, что этот скрипт отлично работает при обращении к локальным файлам на сервере.Но в производственной среде, в которой есть изображения на S3, мы не можем получить ни одно из изображений для копирования из исходных изображений сообщений.Я думаю, что это может быть проблемой с синхронизацией, например, контроллер не ждет, пока скрепка завершит загрузку файлов в каталог приложения, прежде чем завершить процесс, но я не могу заставить что-либо работать.Кроме того, я не эксперт по рельсам, поэтому я немного растерялся.

Спасибо

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Я столкнулся с проблемой с именами файлов, которые также были искажены Tempfile, и в итоге получил это несколько хакерское решение:

ba.blog_article_images.each do |blog_img|
  new_img = blog_img.image.to_file
  new_img.instance_variable_set("@original_filename", blog_img.image.original_filename)
  def new_img.original_filename
    @original_filename
  end
  new_ba.blog_article_images.build(:image => new_img, :embedded => blog_img.embedded?)
end

оно действительно работает.original_filename - это метод, который Paperclip добавляет к File, и мы просто переопределяем его здесь.

Я не проверял это с локальным хранилищем, но после чтения источника Paperclip он должен работать.

1 голос
/ 07 декабря 2010

Файл искажается, потому что файл из object_1 копируется из S3 и сохраняется как TempFile, который создает собственное имя файла, используя исходное имя файла в начале и расширение в конце. Я тоже работаю над этой же проблемой и ценю любые мысли о том, как изменить имя TempFile перед сохранением object_2.

1 голос
/ 04 декабря 2010

Я работаю над чем-то похожим. Я обнаружил, что просто делая object_2.file = object_1.file, затем сохранение object_2 работает нормально В основном. Передача S3 работает, но имя файла искажается по неизвестной причине.

...