使用seed.rb文件创建记录时CarrierWave :: FormNotMultipart错误

时间:2014-07-05 09:01:35

标签: ruby-on-rails ruby ruby-on-rails-4 carrierwave

我的模型有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吗?

3 个答案:

答案 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

CarrierWave wiki has some documentation on this,但不是很广泛。

答案 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")