ruby-on-rails - rails - ruby carrierwave tutorial
Carrierwave, creando un archivo adjunto duplicado al duplicar su modelo que contiene (4)
No creo que Carrierwave tenga esta opción. Sin embargo, puede hacer uso del método * _remote_url = para establecer que la imagen del nuevo modelo sea un duplicado del primero.
Aquí hay un breve ejemplo
Digamos que tengo un modelo que has_one: foto adjunta con carrierwave. Puedo duplicar, el modelo, configurar la foto a la anterior y guardarla. Ejemplo:
first_model = User.first
duplicate_model = first_model.dup #(where the dup code duplicates everything else you need)
duplicate_model.remote_photo_url = first_model.photo_url
duplicate_model.save
Esto "copiaría" la foto del primer objeto en su segundo como nuevo adjunto de carrierwave.
Me gustaría duplicar un modelo. El modelo original contiene un archivo adjunto a través de Carrierwave. Idealmente, se crearía un nuevo archivo adjunto, que es una copia de la imagen original, para el nuevo objeto modelo.
He revisado la documentación de Carrierwave y he buscado en Google este problema, pero no he encontrado una solución que cree un nuevo duplicado de la imagen original. ¿Es esto razonable? ¿Posible?
Para mí con CarrierWave 0.10 esto funciona bien:
user = User.first
dup_user = user.dup
dup_user.photo = user.photo
dup_user.save
Aunque no estoy seguro de cómo funciona esto cuando se usa el almacenamiento en la nube como S3
Prueba esta gema https://github.com/equivalent/copy_carrierwave_file , que maneja tanto el almacenamiento local como el almacenamiento mediante niebla.
original_resource = User.last
new_resource = User.new
CopyCarrierwaveFile::CopyFileService.new(original_resource, new_resource, :avatar).set_file
new_resource.save
nev_resource.avatar.url # https://...image.jpg
Si bien copy_carrierwave_file
es una gema limpia, no es necesario siempre y cuando use el almacenamiento local.
carrierwave
puede usar archivos locales como fuente de archivos adjuntos y puede usar esto para duplicar el archivo adjunto:
first_user = User.first
duplicate_user = first_user.dup
duplicate_user.photo = File.open(first_user.photo.file.file) if first_user.photo.present?
duplicate_user.save
Esto es más eficiente que enrutar la imagen dos veces a través de su servidor web.