que - Problema de Ruby on Rails con Paperclip mientras se carga a s3
ruby on rails que es (2)
He intentado lo mismo con clip, pero fue un poco complicado.
Así que preferí usar los rieles para cargar archivos y recuperarlos,
Se puede hacer por,
<%= f.file_field :file_name %>
<div class="actions">
<%= f.submit "Upload" %>
</div>
Puede ser recuperado por,
File.open(Rails.root.join( ''app/assets/images/'', memory.original_filename), ''wb'') do |file|
file.write(memory.read)
end
Tengo un modelo de registro y controlador:
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
Hay dos archivos adjuntos: el último registro y el archivo.
El método upload_record
carga un registro y verifica que haya otro registro presente en el último registro (el último registro solo puede ser un registro y el archivo puede tener muchos). Cuando hay un registro existente en la última create_archive
o podemos decir si hay un registro actual, se llama al método create_archive
que convierte el último registro en un registro de archivo y lo guarda en la carpeta de archivo en s3. El registro subido recientemente se convierte en el record
actual.
Hay un método change_record
que se llama cuando se hace clic en el botón ''make current'' en cualquiera de los archivos. En el método change_record
, convierto el último registro en un archivo y el archivo create_archive
en el último registro utilizando los dos métodos create_archive
y create_current
.
Cuando convierto cualquier registro en un archive_record
lo hago con éxito y puedo ver que el registro se guarda en /record/archive/
en S3, pero cuando convierto el registro de archivo en el registro actual, el registro no se guarda en /record/latest/
en S3.
Gracias por leer este largo problema. ¿Alguien me puede ayudar?
Hice una clonación profunda de registro de clips en mi proyecto y también tuve problemas con URI.parse, simplemente abandoné el registro existente de clips y funcionó bien. Bueno, en tu caso, esto debería funcionar bien
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