使用CarrierWave,Rails 3上传种子文件

时间:2010-10-11 21:41:11

标签: ruby-on-rails ruby rake carrierwave seed

我正在尝试使用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播种?

6 个答案:

答案 0 :(得分:39)

原来CarrierWave的文档略显错误。有一段更新的代码in the README at the GitHub repository for the project

简而言之,但是:

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

答案 1 :(得分:10)

只要使用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'])
},
{...

答案 2 :(得分:2)

这是一个示例脚本,我将其合并到我的一个项目的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的文件打包到assets文件夹中。我不仅仅对建议有所了解。改进。

答案 3 :(得分:0)

全部在文档中: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!

答案 4 :(得分:0)

在@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都会返回一个标准网址,因此您可以使用您选择的任何网址。

上面的示例假定您存储图像的用户模型属性称为avatar

如果属性被称为图像,你会这样写:

remote_image_url: (Faker::Avatar.image)

答案 5 :(得分:-2)

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

  1. 在模型中注释掉mount_uploader行
  2. 播种数据
  3. 取消注释模型中的行