30

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

4

6 に答える 6

39

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!
于 2010-10-12T09:44:20.000 に答える
11

アップローダがモデルにマウントされている限り、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'])
},
{...
于 2012-10-15T12:37:54.587 に答える
2

これは、私のプロジェクトの 1 つで、seed.rb ファイルに組み込んだサンプル スクリプトです。改善できると確信していますが、良い実例を提供しています。

プルしているすべてのアセットは app/assets/images 内に保存され、Info オブジェクトの名前と一致する名前が付けられます (スペースをアンダースコアに置き換え、名前を小文字にした後)。

はい、非効率的に聞こえますが、これらのアセットを FTP のどこかに配置することを除けば、Carrierwave と Fog を使用して、リモート サーバーがファイルを S3 に直接アップロードできることが最善の解決策です。

My Info モデルはhas_oneGallery モデルにhas_many関連付けられており、このモデルは Photo モデルに関連付けられています。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 にアップロードするファイルをアセット フォルダー内にパッケージ化する必要はありません。私は提案と改善にオープンです。

于 2011-11-14T20:12:35.530 に答える