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!
Mount_uploaderメソッドを使用してアップローダーがモデルにマウントされている限り、関連するopenメソッドを使用してモデルにcarrierwaveをシードできます。これは、同じことを達成するためのより簡潔な方法になります。私の場合、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'])
},
{...
これは、私のプロジェクトの1つのseed.rbファイルに組み込んだスクリプトの例です。改善できると確信していますが、良い例を示しています。
プルするすべてのアセットはapp/assets/images内に保存され、Infoオブジェクトの名前と一致する名前が付けられています(スペースをアンダースコアに置き換えて名前を小文字にした後)。
はい、それは非効率に聞こえますが、それらのアセットをどこかのFTPに配置することを除けば、CarrierwaveとFogを使用してファイルをS3に直接アップロードできることがリモートサーバーにとって最良のソリューションです。
私の情報モデルには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にアップロードするファイルをアセットフォルダー内にパッケージ化する必要はありません。私は提案や改善を受け入れるだけではありません。
@joseph jaberのコメントに基づいて、これは私にとっておもてなしになりました。
以下のコードは_seeds.rb
_にある必要があります
_20.times do
User.create!(
name: "John Smith",
email: "[email protected]",
remote_avatar_url: (Faker::Avatar.image)
)
end
_
これにより、20人のユーザーが作成され、それぞれに異なるアバター画像が提供されます。
私はフェイカージェムを使用してデータを生成しましたが、_Faker::Avatar.image
_が行うのは標準のURLを返すことだけなので、任意のURLを使用できます。
上記の例では、画像を保存するユーザーモデル属性がavatar
と呼ばれることを前提としています。
属性がimageと呼ばれる場合、次のように記述します。
remote_image_url: (Faker::Avatar.image)
それはすべてドキュメントにあります: 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!