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_archive和create_current.
当我将任何记录转换archive_record为成功时,它能够成功地执行此操作,并且能够看到记录保存/record/archive/在S3中,但是当我将存档记录转换为当前记录时,记录不会保存/record/latest/在S3中.
感谢您阅读这个长期问题.有人可以帮我吗?
我在项目中对回形针记录进行了一些深度克隆,也遇到了 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)
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |