Wysyłanie plików za pomocą CarrierWave, Rails 3

Próbuję zalać bazę danych w Rails 3 obrazami używając CarrierWave, jednak nic, co próbuję, nie działa bez konieczności ręcznego przesyłania ich wszystkich.

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!
Czy ktoś wie jak w ogóle siewu używać CarrierWave?
Author: Nathan Kleyn, 2010-10-12

6 answers

Okazuje się, że dokumentacja dla CarrierWave jest nieco błędna. Istnieje bardziej aktualny fragment kodu w README w repozytorium GitHub dla projektu .

W skrócie:

pi = ProductImage.create!(:product => product)
pi.image.store!(File.open(File.join(Rails.root, 'test.jpg')))
product.product_images << pi
product.save!
 39
Author: Nathan Kleyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 03:58:07

Tak długo, jak Twój uploader jest zamontowany do twojego modelu, używając metody mount_uploader, możesz zasiać swoje modele za pomocą carrierwave przy użyciu odpowiedniej metody otwartej. Byłby to bardziej zwięzły sposób osiągnięcia tego samego. W moim przypadku wysyłam z adresu 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'])
},
{...
 9
Author: nomasprime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-15 12:37:54

Oto przykładowy skrypt, który włączyłem do zalążka.plik rb dla jednego z moich projektów. Jestem pewien, że można to poprawić, ale zapewnia dobry przykład pracy.

Wszystkie zasoby, które wyciągam, są przechowywane w aplikacji / zasobach / obrazach i mają nazwy pasujące do nazw moich obiektów Info(po zastąpieniu spacji podkreślnikami i zmniejszeniu nazw).

Tak to brzmi nieefektywnie, ale oprócz umieszczania tych aktywów na FTP gdzieś tam, jest to najlepsze rozwiązanie, jakie znalazłem dla mojego zdalny serwer, aby móc przesyłać pliki bezpośrednio do S3 za pomocą Carrierwave i Fog.

Mój Model Info ma skojarzenie has_one z modelką z galerii, która ma skojarzenie has_many z modelką ze zdjęciem. Carrierwave uploader jest zamontowany na kolumnie' file' (string) tego modelu.

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

To działa dla mnie bezbłędnie, ale idealnie nie musiałbym pakować plików, które przesyłam do S3 w folderze assets. Jestem bardziej niż otwarty na sugestie i ulepszenia.

 2
Author: Olivier Lacan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 20:12:35

Wszystko jest w dokumentacji: 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!
 0
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-11 14:50:42

Bazując na komentarzu Josepha jabera, to dla mnie zadziałało:

Poniższy kod powinien być w seeds.rb

20.times do
        User.create!(
            name: "John Smith",
            email: "[email protected]",
            remote_avatar_url: (Faker::Avatar.image)
        )
    end

To stworzy 20 użytkowników i da każdemu inny obraz awatara.

Użyłem klejnotu fakera do wygenerowania danych, ale wszystko {[2] } Zwraca standardowy adres url, więc możesz użyć dowolnego wybranego adresu url.

Powyższy przykład zakłada, że atrybut User models, w którym przechowujesz obrazy, nazywa się avatar

Jeśli atrybut został wywołany obrazek napisałbyś tak:

remote_image_url: (Faker::Avatar.image)

 0
Author: Sami Birnbaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 11:03:26

Najprostszym rozwiązaniem było dla mnie:

  1. komentarz-wypisz linię mount_uploader w modelu
  2. Seed danych
  3. odkomentuj linię w modelu
 -1
Author: Rami Hussein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 02:59:36