2015-09-18 11 views
9

を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 

2つの添付ファイルがあります。

メソッドupload_recordは、レコードをアップロードし、最新のレコードに他のレコードが存在するかどうかをチェックします(最新のレコードは1つのレコードのみで、アーカイブは多数のレコードを持つことができます)。最新のレコードがある場合、または現在のレコードがある場合は、create_archiveというメソッドが呼び出され、最新のレコードをアーカイブレコードに変換し、s3のアーカイブフォルダに保存します。新しくアップロードされたレコードは現在のrecordになります。

アーカイブのいずれかに「現在の」ボタンをクリックしたときに呼び出される方法change_recordがあります。 change_recordメソッドでは、最新のレコードをアーカイブに変換し、クリックしたアーカイブをcreate_archivecreate_currentの2つのメソッドを使用して最新のレコードに変換します。

私はS3 に/record/archive/に保存されますが、私は現在のレコードにアーカイブレコードを変換するときにレコードがで救われていない、それは成功し、それをやっていると私はレコードを参照することができる午前archive_recordに任意のレコードを変換しますS3の/record/latest/

この長い問題をお読みいただきありがとうございます。誰かが私を助けることができますか?

+0

、それはによって取得することができますそれは、によって

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

を行うことができます

、ファイルをアップロードし、それを取得するために、レール自体を使用して優先現在の状態にすると '/ record/archive'には保存されませんが、'/record/latest'に保存されると期待します。これが誤植なのか、問題の説明の始まりなのかはわかりません。 – Shadwell

+0

申し訳ありません...編集済み – user4965201

+0

@ user4965201あなたの投稿をスペル/文法のために編集しました。それはあなたが意図したようにそれはまだ理にかなっていますか? ;) – madcow

答えて

1

プロジェクトでペーパークリップのレコードを深くクローンしてしまい、URI.parseの問題に直面してしまったので、既存のクリップクリップのレコードを単に破棄して正常に動作しました。あなたのケースでは、これはうまくいくはずです

0

私はペーパークリップを使って同じことを試みましたが、少し複雑でした。

だから私は、あなたがそれを言う

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

ほんのちょっとした提案です。私は私のプロジェクトでこのメソッドを使用しています.. –