Ruby on rails在上传到s3时与Paperclip发生问题

use*_*201 8 ruby-on-rails amazon-s3 paperclip ruby-on-rails-4

我有一个记录模型和控制器:

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
Run Code Online (Sandbox Code Playgroud)

有两个附加文件:最新记录和存档.

该方法upload_record上传记录并检查最新记录中是否存在任何其他记录(最新记录只能是一条记录,而归档可以有多条记录).当最近存在现有记录或者我们可以说当前记录是否存在时,create_archive会调用该方法将最新记录转换为存档记录并将其保存到s3中的存档文件夹中.新上传的记录成为当前记录record.

change_record当点击任何档案上的"制作当前"按钮时,会调用一种方法.在该change_record方法中我把最新记录到归档,并使用两种方法点击进入存档的最新记录create_archivecreate_current.

当我将任何记录转换archive_record为成功时,它能够成功地执行此操作,并且能够看到记录保存/record/archive/在S3中,但是当我将存档记录转换为当前记录时,记录不会保存/record/latest/在S3中.

感谢您阅读这个长期问题.有人可以帮我吗?

Chi*_*iya 1

我在项目中对回形针记录进行了一些深度克隆,也遇到了 URI.parse 的问题,我只是转储了现有的回形针记录,它工作得很好。对于你的情况,这应该可以正常工作

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
Run Code Online (Sandbox Code Playgroud)