Rails 5 ActiveStorage 如何等待所有线程完成
Rails 5 ActiveStorage How to wait for all threads to finish
首先,让我描述一下问题。我正在使用 RSpec 到 运行 脚本来生成一些测试数据。
RAILS_ENV=development rspec spec/dev/food/food_upload.rb
脚本看起来像这样。
image = fixture_file_upload(Rails.root.join('spec', 'resources', 'test2.png'), 'image/png')
(0..200).each {
food = FactoryBot.build :food
p "Loading #{food.name}"
expect {
post :upload, params: {
"foodUpload_foodName"=> food.name,
"foodUpload_image"=> image
}
}.to change(Food, :count).by(1)
.and change(Image, :count).by(1)
此脚本会将数据发送到 FoodController,然后添加更多食物。每个食物都使用 ActiveStorage 来保存图像。
问题是这个脚本完成得太快了,正如我发现的那样,ActiveStorage 产生了新的线程来处理图像。结果,我有很多未完成的图像,并且在尝试加载图像时显示 'minimagick::invalid error with message improper image header'。
目前,我正在使用 sleep(5.minutes) 来处理这个问题。只是想知道是否有另一种方法可以正确地做到这一点。
答案是将 image = fixture_file_upload()
移动到 (0..200).each {} 循环中。花了我一天时间
首先,让我描述一下问题。我正在使用 RSpec 到 运行 脚本来生成一些测试数据。
RAILS_ENV=development rspec spec/dev/food/food_upload.rb
脚本看起来像这样。
image = fixture_file_upload(Rails.root.join('spec', 'resources', 'test2.png'), 'image/png')
(0..200).each {
food = FactoryBot.build :food
p "Loading #{food.name}"
expect {
post :upload, params: {
"foodUpload_foodName"=> food.name,
"foodUpload_image"=> image
}
}.to change(Food, :count).by(1)
.and change(Image, :count).by(1)
此脚本会将数据发送到 FoodController,然后添加更多食物。每个食物都使用 ActiveStorage 来保存图像。
问题是这个脚本完成得太快了,正如我发现的那样,ActiveStorage 产生了新的线程来处理图像。结果,我有很多未完成的图像,并且在尝试加载图像时显示 'minimagick::invalid error with message improper image header'。
目前,我正在使用 sleep(5.minutes) 来处理这个问题。只是想知道是否有另一种方法可以正确地做到这一点。
答案是将 image = fixture_file_upload()
移动到 (0..200).each {} 循环中。花了我一天时间