我的模型有image
列。我正在使用CarrierWave
上传图片(我正在关注此rails cast来执行此操作。
现在,我想使用seed.rb
文件创建一些默认记录,但我未能为图像提供正确的parh / url。
因此,我在列表项app/public/images/
文件夹中有图像,这是seed.rb
文件中的代码:
gems = {
test1: {
name: 'test1',
description: 'test1',
image: '/public/images/test1.png',
},
test2: {
name: 'test2',
description: 'test2',
image: '/public/images/test2.png'
}
gems.each do |user, data|
gem = DemoGem.new(data)
unless DemoGem.where(name: gem.name).exists?
gem.save!
end
end
当我运行rake db:seed
命令时,我收到以下错误:
CarrierWave :: FormNotMultipart:您尝试分配字符串或 上传者的路径名,出于安全原因,这是不允许的。
有人可以告诉我们如何为图片提供正确的url
吗?
答案 0 :(得分:16)
假设您的Gem
模型将image
字段作为Carrierwave上传器(即mount_uploader :image, ImageUploader
模型中有Gem
或类似内容),可以将ruby File
对象分配给image
属性,而不是字符串。像这样:
gem = Demogem.new(data)
image_src = File.join(Rails.root, "/public/images/test2.png")
src_file = File.new(image_src)
gem.image = src_file
gem.save
在整个代码中,您可以更改种子数据(因此哈希中的image
属性设置为File.new(File.join(Rails.root, "/public/images/test1.jpg"))
或更改构建新记录的方式,因此不会使用默认为image
:
gems.each do |user, data|
gem = DemoGem.new(data.reject { |k, v| k == "image" })
gem.image = new File(File.join(Rails.root, data["image"]))
unless DemoGem.where(name: gem.name).exists?
gem.save!
end
end
答案 1 :(得分:0)
这就是我对我的案子所做的事情:
["Sublime Text 3", "Internet Explorer"].each do |title|
unless Post.exists?(title: title)
post = Post.create!(title: title,
subtitle: "Subtitle of the #{title}",
content: "A sample post of the content about #{title}",
author: User.first)
post.attachments_attributes = [file: Rails.root.join("spec/fixtures/photo.jpg").open]
post.save!
end
end
答案 2 :(得分:0)
像这样将内容放入种子文件的聪明方法
Rails.root.join("#{Rails.root}/app/assets/images/image_a.jpg")