2015-09-18 24 views
9

Mam modelu rekordu i kontrolera:Ruby on Rails problemu ze spinacza podczas przesyłania do 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 

Istnieją dwa załączone pliki: najnowszy rekord i archiwum.

Metoda upload_record powoduje przesłanie rekordu i sprawdzenie, czy w ostatnim rekordzie znajduje się jakikolwiek inny rekord (ostatni rekord może być tylko jeden, a archiwum może mieć wiele). Jeśli istnieje najnowszy rekord lub możemy powiedzieć, czy jest obecny rekord, wywoływana jest metoda create_archive, która konwertuje najnowszy rekord do rekordu archiwum i zapisuje go w folderze archiwum w s3. Nowo przesłany rekord staje się bieżącym numerem record.

Istnieje metoda change_record, która jest wywoływana po kliknięciu przycisku "Wykonaj bieżący" w dowolnym z archiwów. W metodzie change_record przekształcam najnowszy rekord w archiwum i kliknę archiwum w najnowszy rekord przy użyciu dwóch metod: create_archive i create_current.

Kiedy przekonwertować dowolny rekord do archive_record jest z powodzeniem robi to i jestem w stanie widzieć rekord zostanie zapisany w /record/archive/ w S3 ale kiedy konwertować rekord archiwum do bieżącego rekordu rekord nie jest uzyskiwanie zapisane w /record/latest/ w S3.

Dziękuję za przeczytanie tego długiego problemu. Czy ktoś może mi pomóc?

+0

Mówisz, że to nie zapisywane w '/ record/archive', gdy je wprowadzisz, ale możesz oczekiwać, że zostanie zapisane w'/record/latest'. Nie jestem pewien, czy to literówka, czy początki wyjaśnienia problemu. – Shadwell

+0

Przepraszam ... edytowałem – user4965201

+0

@ user4965201 Edytowałem twój wpis pod względem pisowni/gramatyki. Czy możesz jeszcze raz sprawdzić, czy nadal ma to sens, tak jak zamierzałeś? ;) – madcow

Odpowiedz

1

Zrobiłem głębokie klonowanie rekordu spinacza w moim projekcie i zbyt napotkałem problemy z URI.parse, po prostu zrzuciłem istniejący rekord spinacza i działało dobrze. Więc w twoim przypadku, to powinno działać dobrze

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

Próbowałem to samo za pomocą spinacza, ale było to trochę skomplikowane.

więc wolałem użyciu szyn się do przesyłania plików i odzyskać je,

można to zrobić przez,

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

To mogą być pobierane przez,

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

Tylko sugestia. Używam tej metody w moim projekcie .. –