質問

CarrierWaveを使用して画像を使用してRails 3にデータベースをシードしようとしていますが、手作業ですべてアップロードする必要があるとは思えません。

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を使用してシードする方法を知っている人はいますか?

役に立ちましたか?

解決

CarrierWaveのドキュメントは少し間違っていることがわかりました。最新のコードがもっとあります プロジェクトのgithubリポジトリのreadmeで.

一言で言えば、:

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

他のヒント

Must_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に置くこととは別に、CarrierWaveとFogを使用してファイルをS3に直接アップロードできるようにするために、リモートサーバーが見つけた最良のソリューションです。

私の情報モデルには has_one ギャラリーモデルとの関連 has_many 写真モデルとの関連。 CarrierWaveアップローダーは、そのモデルの「ファイル」(String)列にマウントされています。

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

これは私にとって完璧に機能しますが、理想的には、Assetsフォルダー内で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 Gemを使用してデータを生成しましたが、すべて Faker::Avatar.image 標準のURLを返すことであるため、選択したURLを使用できます。

上記の例は、あなたが保存する場所のユーザーモデル属性が画像と呼ばれることを前提としています avatar

属性が画像と呼ばれた場合、次のように書くでしょう。

remote_image_url: (Faker::Avatar.image)

私にとって最も簡単な解決策は、次のとおりです。

  1. モデルのmount_uploaderラインにコメントします
  2. データをシードします
  3. モデルのラインを解除します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top