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 方法为您的模型播种载波。这将是实现相同目标的更简洁的方式。就我而言,我是从 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

这是我为我的一个项目合并到 seed.rb 文件中的示例脚本。我确信它可以改进,但它提供了一个很好的工作示例。

我提取的所有资产都存储在 app/assets/images 中,它们的名称与我的 Info 对象的名称匹配(在我用下划线替换空格并将名称小写之后)。

是的,它听起来确实效率低下,但除了将这些资产放在某个地方的 FTP 上之外,这是我为远程服务器找到的最佳解决方案,它能够使用 Carrierwave 和 Fog 将文件直接上传到 S3。

我的 Info 模型has_one与 Gallery 模型有关联,Gallery 模型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 的文件打包到 assets 文件夹中。我非常愿意接受建议和改进。

于 2011-11-14T20:12:35.530 回答
1

这一切都在文档中: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!
于 2017-11-11T14:50:42.663 回答
1

基于@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)

于 2018-05-30T11:03:26.990 回答
-2

对我来说最简单的解决方案是:

  1. 注释掉模型中的 mount_uploader 行
  2. 播种数据
  3. 取消注释模型中的行
于 2016-06-11T01:17:06.863 回答