Pregunta

Estoy tratando de sembrar una base de datos en Rails 3 con imágenes utilizando CarrierWave, sin embargo nada que intento parece brevemente el trabajo de tener que subirlos todo 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 usar las semillas CarrierWave en absoluto?

¿Fue útil?

Solución

Resulta que la documentación de CarrierWave es un poco mal. Hay una pieza más hasta la fecha de código en el README en el repositorio 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!

Otros consejos

En tanto que el cargador se monta en su modelo, utilizando el método mount_uploader, se puede sembrar sus modelos con carrierwave utilizando el método abierto relevante. 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'])
},
{...

El siguiente es un ejemplo de script que se incorporen a un fichero seed.rb para uno de mis proyectos. Estoy seguro de que se puede mejorar pero proporciona un buen ejemplo de trabajo.

Todos los activos que estoy tirando están almacenados dentro de la aplicación / activos / imágenes y tienen nombres que coinciden con los nombres de mi Información de objetos (después de sustituir los espacios por guiones bajos y downcase los nombres).

Sí lo hace sonido ineficiente, pero aparte de poner esos activos en un FTP somehwhere, que es la mejor solución que encontré para mi servidor remoto para poder subir los archivos directamente a S3 usando Carrierwave y niebla.

Mi Información modelo tiene una asociación has_one a un modelo Gallery, que tiene una asociación has_many a un modelo de la foto. El cargador Carrierwave está montado en el 'archivo' (cadena) columna de dicho 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 lo ideal es que no tendría que empaquetar los archivos que estoy subiendo a S3 dentro de la carpeta de activos. Estoy más que abierto a sugerencias y mejoras.

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!

Sobre la base de Jaber comentario @joseph esto funcionó un regalo para mí:

El código siguiente shoud estar en seeds.rb

20.times do
        User.create!(
            name: "John Smith",
            email: "john@gmail.com",
            remote_avatar_url: (Faker::Avatar.image)
        )
    end

Esto creará 20 usuarios y dar a cada imagen de avatar diferente uno a.

He utilizado la gema falsificador para generar los datos, pero todos Faker::Avatar.image hace es devolver un URL estándar, por lo que podría utilizar cualquier URL de su elección.

El ejemplo anterior se supone que los modelos de atributos del usuario donde se almacenan las imágenes usted se llama avatar

Si el atributo se llama la imagen que iba a escribir así:

remote_image_url: (Faker::Avatar.image)

La solución más fácil para mí fue:

  1. Comentario de salida de la línea de mount_uploader en el modelo
  2. Seed los datos
  3. Elimine la línea en el modelo
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top