我正在尝试使用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播种?
答案 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)
对我来说最简单的解决方案是: