سؤال

أحاول أن أحصل على قاعدة بيانات في Rails 3 مع صور باستخدام CarrierWave ، ولكن لا شيء أحاول يبدو أنه لا يلزم تحميلها جميعًا باليد.

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!

أي شخص يعرف كيفية البذور باستخدام الموجة النقل على الإطلاق؟

هل كانت مفيدة؟

المحلول

تبين أن الوثائق الخاصة بـ CarrierWave خاطئة قليلاً. هناك قطعة رمز أكثر تحديثًا في ReadMe في مستودع GitHub للمشروع.

باختصار ، على الرغم من:

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

نصائح أخرى

طالما تم تثبيت تحميلك على النموذج الخاص بك ، باستخدام طريقة mount_uploader ، يمكنك أن تبهر النماذج الخاصة بك باستخدام الموجة الناقلة باستخدام الطريقة المفتوحة ذات الصلة. ستكون هذه طريقة أكثر إيجازًا لتحقيق نفس الشيء. في حالتي ، أقوم ببذر من عنوان 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'])
},
{...

فيما يلي مثال على البرنامج النصي الذي قمت بدمجه في ملف seed.rb لأحد مشاريعي. أنا متأكد من أنه يمكن تحسينه ولكنه يوفر مثالًا جيدًا للعمل.

يتم تخزين جميع الأصول التي أسحبها داخل التطبيق/الأصول/الصور ولديها أسماء تطابق أسماء كائنات المعلومات الخاصة بي (بعد استبدال المساحات بأسماء السفلية وأسفل الأسماء).

نعم ، يبدو الأمر غير فعال ، ولكن بصرف النظر عن وضع هذه الأصول على FTP في مكان ما ، فهو أفضل الحلول التي وجدتها لخادمتي عن بُعد لتتمكن من تحميل الملفات مباشرة إلى S3 باستخدام CarrierWave و Fog.

نموذج المعلومات الخاص بي يحتوي على ملف has_one رابطة إلى نموذج معرض ، الذي يحتوي على ملف has_many ارتباط لنموذج الصور. يتم تثبيت جهاز تحميل CarrierWave على عمود "الملف" (سلسلة) من هذا النموذج.

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

هذا يعمل بشكل لا تشوبه شائبة بالنسبة لي ، لكن من الناحية المثالية ، لن أضطر إلى حزم الملفات التي أقوم بتحميلها إلى S3 داخل مجلد الأصول. أنا أكثر من منفتح على الاقتراحات والتحسينات.

كل ما في الوثائق: 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!

بناء على تعليق @joseph jaber ، عمل هذا الأمر بالنسبة لي:

الكود أدناه يكون في seeds.rb

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

سيؤدي ذلك إلى إنشاء 20 مستخدمًا ويمنح كل واحد صورة تجسدية مختلفة.

لقد استخدمت جوهرة faker لإنشاء البيانات ولكن الكل Faker::Avatar.image DO هو إرجاع عنوان URL قياسي ، بحيث يمكنك استخدام أي عنوان URL من اختيارك.

يفترض المثال أعلاه أن نماذج المستخدم تنسب إلى المكان الذي تقوم فيه بتخزين الصور التي يتم استدعاؤها avatar

إذا كانت السمة تسمى الصورة ، فستكتب هكذا:

remote_image_url: (Faker::Avatar.image)

كان الحل الأسهل بالنسبة لي:

  1. التعليق على خط mount_uploader في النموذج
  2. بذرة البيانات
  3. إلغاء الافصح في النموذج
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top