2010-11-23 2 views
2

Ich habe ein Problem, das nur diese Anwendung in der Produktionsumgebung betrifft. Wir haben eine einzelne Controller-Aktion, die verwendet wird, um Artikelobjekte zu "klonen", indem ein neues Objekt erstellt wird, die Attribute einander gleich gesetzt werden und dann die Bilder zum Objekt hinzugefügt werden. HierKopieren von Bildern mit Paperclip Gem nicht möglich mit image.to_file für S3-Bilder

ist der Teil des Controller, der das tut:

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 

Ende

Das Problem ist, dass dieses Skript perfekt funktioniert, wenn auf lokale Dateien auf dem Server verweisen. In der Produktionsumgebung, in der die Bilder auf S3 gespeichert sind, können jedoch keine der Bilder aus den ursprünglichen Posts Images kopiert werden. Ich denke, das könnte ein Problem mit dem Timing sein, so wie der Controller nicht darauf wartet, dass die Büroklammer die Dateien in das App-Verzeichnis lädt, bevor sie den Prozess beendet, aber ich kann scheinbar nichts zum Laufen bringen. Außerdem bin ich kein Rails-Experte, also bin ich ein bisschen verloren.

Danke

Antwort

1

Ich arbeite an etwas Ähnliches. Ich habe festgestellt, dass object_2.file = object_1.file einfach funktioniert, dann funktioniert das Speichern von object_2 einwandfrei. Meist. Die S3-Übertragung funktioniert Dandy, aber der Dateiname wird aus unbekannten Gründen verstümmelt.

1

Die Datei wird beschädigt, weil die Datei von object_1 aus S3 kopiert und als TempFile gespeichert wird, die ihren eigenen Dateinamen unter Verwendung des ursprünglichen Dateinamens am Anfang und Ende am Ende erstellt. Ich arbeite auch an diesem Problem und freue mich darüber, wie Sie den TempFile-Namen vor dem Speichern von object_2 ändern können.

+0

Hattest du jemals Glück, das herauszufinden? Ich habe das gleiche Problem. –

2

Ich habe in der Frage laufen mit Dateinamen von Tempfile und verstümmelt zu werden, und endete mit dieser etwas hackish Lösung:

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 

es aber funktioniert. original_filename ist eine Methode, die Paperclip zu File hinzufügt, und wir übersteuern es einfach hier.

Ich habe dies nicht mit einem lokalen Speicher getestet, aber aus dem Lesen der Paperclip-Quelle sollte es funktionieren.

+0

Danke für die tolle Antwort, das hat für mich funktioniert. Ich habe eine Tabelle mit zwei Reihen von Bildspalten, eine für das eigentliche Bild und eine für eine temporäre Version, nachdem sie hochgeladen wurde, aber bevor sie gespeichert wird. Wenn der Datensatz gespeichert wird, kopiere ich das temporäre Bild in das tatsächliche Bild und dies hält die Dateinamen konsistent. –

Verwandte Themen