ruby-on-rails - mount_uploader - rails image upload
Siembra de cargas de archivos con CarrierWave, Rails 3 (6)
Estoy tratando de sembrar una base de datos en Rails 3 con imágenes usando CarrierWave, sin embargo, nada de lo que intento parece tener que cargarlas todas a mano.
pi = ProductImage.new(:product => product)
pi.image = File.open(File.join(Rails.root, ''test.jpg''))
pi.store_image! # tried with and without this
product.product_images << pi
product.save!
¿Alguien sabe cómo sembrar usando CarrierWave en absoluto?
Aquí hay un script de ejemplo que incorporé en un archivo seed.rb para uno de mis proyectos. Estoy seguro de que puede mejorarse pero proporciona un buen ejemplo de trabajo.
Todos los recursos que estoy extrayendo se almacenan dentro de la aplicación / activos / imágenes y tienen nombres que coinciden con los nombres de mis objetos de información (después de reemplazar espacios con guiones bajos y nombres de cajas de seguridad).
Sí, suena ineficiente, pero aparte de poner esos recursos en un FTP en algún lugar, es la mejor solución que encontré para que mi servidor remoto pueda cargar los archivos directamente a S3 usando Carrierwave y Fog.
Mi modelo de información tiene una asociación has_one
con un modelo de galería, que tiene una asociación has_many
con un modelo de foto. El cargador de Carrierwave se monta en la columna ''archivo'' (cadena) de ese modelo.
Info.all.each do |info|
info_name = info.name.downcase.gsub('' '', ''_'')
directory = File.join(Rails.root, "app/assets/images/infos/stock/#{info_name}")
# making sure the directory for this service exists
if File.directory?(directory)
gallery = info.create_gallery
Dir.foreach(directory) do |item|
next if item == ''.'' or item == ''..''
# do work on real items
image = Photo.create!(gallery_id: gallery.id)
image.file.store!(File.open(File.join(directory, item)))
gallery.photos << image
end
info.save!
end
end
Esto funciona perfectamente para mí, pero idealmente no tendría que empaquetar los archivos que estoy cargando en S3 dentro de la carpeta de activos. Estoy más que abierto a sugerencias y mejoras.
La solución más fácil para mí fue:
- Comenta la línea mount_uploader en el modelo
- Sembrar los datos
- Descomentar la línea en el modelo.
Resulta que la documentación para CarrierWave es un poco incorrecta. Hay un fragmento de código más actualizado en README en el repositorio de GitHub para el proyecto .
En pocas palabras, sin embargo:
pi = ProductImage.create!(:product => product)
pi.image.store!(File.open(File.join(Rails.root, ''test.jpg'')))
product.product_images << pi
product.save!
Siempre que su cargador esté montado en su modelo, utilizando el método mount_uploader, puede inicializar sus modelos con carrierwave utilizando el método abierto correspondiente. Esta sería una forma más concisa de lograr lo mismo. En mi caso estoy sembrando desde una URL:
Game.create([
{
:title => "Title",
:uuid_old => "1e5e5822-28a1-11e0-91fa-0800200c9a66",
:link_href => "link_href",
:icon => open("http://feed.namespace.com/icon/lcgol.png"),
:updated_at => "2011-01-25 16:38:46",
:platforms => Platform.where("name = ''iPhone''"),
:summary => "Blah, blah, blah...",
:feed_position => 0,
:languages => Language.where("code = ''de''"),
:tags => Tag.where(:name => [''LCGOL'', ''TR'', ''action''])
},
{...
Sobre la base del comentario de @joseph jaber, esto me resultó muy útil:
El código a continuación debería estar en seeds.rb
20.times do
User.create!(
name: "John Smith",
email: "[email protected]",
remote_avatar_url: (Faker::Avatar.image)
)
end
Esto creará 20 usuarios y le dará a cada uno una imagen de avatar diferente.
He usado la gema faker para generar los datos, pero todo lo que hace Faker::Avatar.image
es devolver una url estándar, por lo que puede usar cualquier url de su elección.
El ejemplo anterior asume que el atributo de Modelos de usuario donde almacena sus imágenes se llama avatar
Si el atributo se llamara imagen, escribirías así:
remote_image_url: (Faker::Avatar.image)
Todo está en la documentación: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-%22Upload%22-from-a-local-file
restaurant = Restaurant.create!(name: "McDonald''s")
restaurant.logo = Rails.root.join("db/images/mcdonalds_logo.png").open
restaurant.save!