使用活动存储在 rails 中的 seed.rb 文件中附加图像

And*_*son 6 ruby rails-activestorage

我有一个叫做车辆的类,它可以附加一个图像。如果在 Vehicle.rb 文件中没有上传其他图像,我已经制作了一个默认图像来显示。

我想在seed.rb 文件中包含图像,这样我就不必手动上传所有图像。这可能吗?

非常感谢帮助。

这是我的车辆.rb:

class Vehicle < ApplicationRecord
  belongs_to :make
  belongs_to :model
  accepts_nested_attributes_for :make
  accepts_nested_attributes_for :model
  has_one_attached :image

  after_commit :add_default_image, on: %i[create update]

  def add_default_image
    unless image.attached?
      image.attach(
        io: File.open(Rails.root.join('app', 'assets', 'images', 'no_image_available.jpg')),
        filename: 'no_image_available.jpg', content_type: 'image/jpg'
      )
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我在种子文件中创建记录的方式,但我也想包含图像:

v = Vehicle.create(
  vin: '1QJGY54INDG38946',
  color: 'grey',
  make_id: m.id,
  model_id: mo.id,
  wholesale_price: '40,000'
)
Run Code Online (Sandbox Code Playgroud)

her*_*nte 8

您可以使用Ffaker gem 轻松生成假数据,最后在创建车辆记录后,您可以从实例变量更新您的记录图像属性。检查附加文件/IO 对象

这将是db/seed.rb文件的代码:

if Vehicle.count.zero?
  10.times do
    v = Vehicle.create(
      vin: FFaker::Code.ean,
      color: FFaker::Color.name,
      maker_id: m.id,
      model_id: m.id,
      wholesale_price: '40,000'
    )
    v.image.attach(io: File.open('/path/to/file'), filename: 'file.jpg')
  end
end
Run Code Online (Sandbox Code Playgroud)

不要忘记将 ffaker gem 添加到您的Gemfile文件中。


小智 5

seeds.rb正如上面的答案所说,它在边缘指南中,对于无法正确获取路径的人来说,这是文件中将头像附加到第一个创建的用户的行的示例:

User.first.avatar.attach(io: File.open(File.join(Rails.root,'app/assets/images/avatar.jpg')), filename: 'avatar.jpg')
Run Code Online (Sandbox Code Playgroud)