Frage

Ich versuche, eine Datenbank in Rails 3 mit Bildern auf Saatgut CarrierWave verwenden, aber nichts, was ich versuche zu funktionieren scheint kurz, sie alle von Hand hochladen zu müssen.

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!

Jeder weiß, wie man Samen CarrierWave überhaupt mit?

War es hilfreich?

Lösung

Stellt sich heraus, die Dokumentation für CarrierWave ist etwas falsch. Es gibt ein mehr up to date Stück Code in der Readme im GitHub-Repository für das Projekt .

Auf den Punkt gebracht, aber:

pi = ProductImage.create!(:product => product)
pi.image.store!(File.open(File.join(Rails.root, 'test.jpg')))
product.product_images << pi
product.save!

Andere Tipps

Solange Ihr Uploader zu Ihrem Modell montiert ist, die mount_uploader Methode verwenden, können Sie Ihre Modelle mit carrierwave mit der entsprechenden offenen Methode Saatgut. Dies wäre eine prägnante Weise das Gleiche zu erreichen. In meinem Fall bin ich Impfen von einer 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'])
},
{...

Hier ist ein Beispiel Skript, das ich in eine seed.rb Datei aufgenommen für eine meiner Projekte. Ich bin sicher, es kann verbessert werden, aber es ist ein gutes Arbeitsbeispiel.

Alle Vermögenswerte Ich ziehe innerhalb der app / assets / images gespeichert und sie haben Namen die Namen meiner Info passenden Objekte (nachdem ich Leerzeichen mit Unterstrichen ersetzen und die Namen downcase).

Ja, es funktioniert Ton ineffizient, aber abgesehen davon, diese Vermögenswerte setzen auf einen FTP-somehwhere, es ist die beste Lösung, die ich für meine Remote-Server gefunden in der Lage sein, die Dateien direkt auf S3 mit Carrierwave und Nebel zu laden.

My Info Modell verfügt über eine has_one Vereinigung zu einem Galerie-Modell, das eine has_many Assoziation zu einem Foto-Modell hat. Der Carrierwave Uploader ist auf der ‚Datei‘ montiert (string) Spalte dieses Modells.

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

Das funktioniert einwandfrei für mich, aber im Idealfall würde ich nicht die Dateien verpacken müssen, dass ich das Hochladen auf S3 bin in das Vermögen Ordner. Ich bin mehr als offen für Anregungen und Verbesserungen.

Es ist alles in der Dokumentation: 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!

Aufbauend auf @ Joseph jaber Kommentar arbeitet dies ein Vergnügen für mich:

Der folgende Code shoud werden in seeds.rb

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

Dies wird 20 Benutzer erstellen und gibt jedes ein anderes Avatar-Bild.

Ich habe die faker Juwel verwendet, um die Daten zu erzeugen, aber alle Faker::Avatar.image tut, ist eine Standard-URL zurückkehren, so dass Sie jede URL Ihrer Wahl verwenden können.

Das obige Beispiel geht davon aus, dass die Benutzermodelle Attribut, wo Sie speichern Sie Bilder genannt wird avatar

Wenn das Attribut Bild aufgerufen wurde Sie so schreiben würde:

remote_image_url: (Faker::Avatar.image)

Die einfachste Lösung für mich war:

  1. Kommentar-out der mount_uploader Linie im Modell
  2. Seed die Daten
  3. Kommentar- der Zeile im Modell
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top