2015-09-18 12 views
9

Ich habe einen Rekord Modell und Controller:Ruby on Rails Problem mit Paperclip beim Hochladen s3

require 'open-uri' 
class Record < ActiveRecord::Base 

    has_attached_file :record, 
        :s3_protocol => :https, 
        :url => ':s3_domain_url', 
        :path => '/record/latest/:basename.:extension' 

    has_attached_file :archive_record, 
        :s3_protocol => :https, 
        :url => ':s3_domain_url', 
        :path => '/record/archive/:basename.:extension' 
end 


class RecordsController < ApplicationController 
    def upload_record 
    @error = nil 
    previous_record = Record.where(:is_archive => false).first 
    @new_record = Record.new(record_params) 
    if @new_record.save 
     unless previous_record.blank? 
     if create_archive(previous_record) 
      previous_record.destroy 
     end 
     end 
     @success = I18n.t('record.success.record_uploaded') 
    else 
     @error = find_error(@new_record) 
    end 

    respond_to do |format| 
     format.js { 
     render :layout => false 
     } 
    end 
    end 

    def change_record 
    previous_record = Record.where(:is_archive => false).first 
    archive_record = Record.where(:id => params[:id]).first 
    if create_archive(previous_record) && create_current(archive_record) 
     previous_record.destroy 
     archive_record.destroy 
    end 
    end 

    private 

    def record_params 
    params.require(:record).permit(:record_type, :record, :version, :release_date) 
    end 

    def create_archive(previous_record) 
    archive = Record.new 
    archive.archive_record = URI.parse(previous_record.record.url) 
    archive.version = previous_record.version 
    archive.record_file_name = previous_record.record_file_name 
    archive.record_content_type = previous_record.record_content_type 
    archive.is_archive = true 
    @archive_record_remote_url = previous_record.record.url 
    archive.save(:validate => false) 
    end 

    def create_current(archive_record) 
    latest = Record.new 
    latest.record = URI.parse(archive_record.archive_record.url) 
    latest.version = archive_record.version 
    latest.record_file_name = archive_record.record_file_name 
    latest.record_content_type = archive_record.record_content_type 
    latest.is_archive = false 
    @archive_record_remote_url = archive_record.archive_record.url 
    latest.save(:validate => false) 
    end 
end 

Es gibt zwei angehängte Dateien: die neueste Aufzeichnung und das Archiv.

Die Methode upload_record lädt einen Datensatz hoch und überprüft, ob im letzten Datensatz ein anderer Datensatz vorhanden ist (letzter Datensatz kann nur einen Datensatz enthalten und das Archiv kann viele enthalten). Wenn zuletzt ein Datensatz vorhanden ist oder wenn ein aktueller Datensatz vorhanden ist, wird die Methode create_archive aufgerufen, die den letzten Datensatz in einen Archivdatensatz konvertiert und ihn in den Archivordner in S3 speichert. Der neu hochgeladene Datensatz wird zum aktuellen record.

Es gibt ein Verfahren change_record, die aufgerufen wird, wenn eine ‚macht Strom‘ Taste auf einen des Archivs angeklickt wird. In der change_record Methode wende ich den neuesten Datensatz in ein Archiv und das angeklickte Archiv in den neuesten Datensatz mit den beiden Methoden create_archive und create_current.

Wenn ich wandeln jeden Datensatz zu einem archive_record es erfolgreich, es zu tun ist, und ich bin in der Lage der Lage, die Aufzeichnung zu sehen ist, in /record/archive/ in S3 gespeichert aber wenn ich das Archiv Datensatz zu aktuellen Datensatz konvertiert der Datensatz nicht gespeichert zu werden in /record/latest/ in S3.

Vielen Dank für dieses lange Problem zu lesen. Kann mir jemand helfen?

+0

Sie sagen, es ist nicht gespeichert in '/ record/archive', wenn Sie es aktuell machen, aber Sie würden erwarten, dass es in'/record/latest' gespeichert wird. Nicht sicher, ob dies ein Tippfehler oder der Beginn der Erklärung des Problems ist. – Shadwell

+0

Es tut mir leid ... bearbeitet – user4965201

+0

@ user4965201 ich Ihren Beitrag für Rechtschreibung/Grammatik bearbeitet. Könnten Sie noch einmal überprüfen, dass es immer noch Sinn macht, wie Sie es sich vorgestellt haben? ;) – madcow

Antwort

1

ich in meinem Projekt einige tiefe Klonen von Büroklammer Rekord tat und auch konfrontiert Probleme mit URI.parse, habe ich einfach Rekord bestehenden Büroklammer abgeladen und es funktionierte gut. Nun, in Ihrem Fall, sollte diese

def create_archive(previous_record) 
    archive = Record.new 
    archive.archive_record = previous_record.record 
    archive.version = previous_record.version 
    archive.is_archive = true 
    @archive_record_remote_url = previous_record.record.url 
    archive.save(:validate => false) 
end 

def create_current(archive_record) 
    latest = Record.new 
    latest.record = archive_record.archive_record 
    latest.version = archive_record.version 
    latest.is_archive = false 
    @archive_record_remote_url = archive_record.archive_record.url 
    latest.save(:validate => false) 
end 
0

funktioniert ich die gleiche Sache mit Büroklammer habe versucht, aber es war etwas kompliziert. So

i bevorzugt die Schienen selbst verwenden, um Dateien hochladen und abrufen es,

Es kann getan werden,

<%= f.file_field :file_name %> 
<div class="actions"> 
<%= f.submit "Upload" %> 
</div> 

Es kann abgerufen werden,

File.open(Rails.root.join('app/assets/images/', memory.original_filename), 'wb') do |file| 
    file.write(memory.read) 
end 
+0

nur ein Vorschlag machen würde. Ich verwende diese Methode in meinem Projekt. –