Ruby on rails 如何循环浏览一系列图像并使用活动存储器保存每个图像?

Ruby on rails 如何循环浏览一系列图像并使用活动存储器保存每个图像?,ruby-on-rails,arrays,ruby,rails-activestorage,Ruby On Rails,Arrays,Ruby,Rails Activestorage,Rails 5.2应用程序 我正在通过一个移动应用程序发送的XML对象的帖子保存多个图像 接收到的图像如下所示: "image_group"=> [ {"report_image"=>"1565721255925.jpg"}, {"report_image"=>"1565721267236.jpg"}, {"report_image"=>"1565721279636.jpg"}, {"report_image"=>"1565721292231.

Rails 5.2应用程序

我正在通过一个移动应用程序发送的XML对象的帖子保存多个图像

接收到的图像如下所示:

"image_group"=>
[
  {"report_image"=>"1565721255925.jpg"}, 
  {"report_image"=>"1565721267236.jpg"}, 
  {"report_image"=>"1565721279636.jpg"}, 
  {"report_image"=>"1565721292231.jpg"}
]
因此,这些图像属于报告。我正在将带有图像的报告保存在处理帖子的控制器中

我正在使用以下块保存要报告的图像:

r = Report.new()

  image_arr = record[:image_group]

  image_arr.each do |image|
    r.images.attach(io: File.open("#{params[image[:report_image]].path}"), filename: "#{image[:report_image]}")
  end

r
当有1或2个图像时,此选项有效。但是,当我执行3次或更多操作时,最后一个report_图像没有路径

以下是错误:

NoMethodError (undefined method `path' for nil:NilClass):
如何解决问题并保存所有图像

下面是rails服务器的全部输出*在以下输出中更改了一些标签。这里要看到的重要一点是,最后一个图像没有路径

financial_image_arr ======== [{"financial_page_image"=>"1565721255925.jpg"}, {"financial_page_image"=>"1565721267236.jpg"}, {"financial_page_image"=>"1565721279636.jpg"}, {"financial_page_image"=>"1565721292231.jpg"}]
image  ================ {"financial_page_image"=>"1565721255925.jpg"}
path  ================ /var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190813-79202-sfqs4i.jpg
  Disk Storage (13.7ms) Uploaded file to key: 65GicEnFZ7868efthA3VaZHs (checksum: l+IKb1kWR786TDXTtZPShw==)
   (0.7ms)  BEGIN
  ↳ app/controllers/skooter/odk_controller.rb:255
  ActiveStorage::Blob Create (1.3ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "metadata", "byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["key", "65GicEnFZ7868efthA3VaZHs"], ["filename", "1565721255925.jpg"], ["content_type", "image/jpeg"], ["metadata", "{\"identified\":true}"], ["byte_size", 2558086], ["checksum", "l+IKb1kWR786TDXTtZPShw=="], ["created_at", "2019-08-13 20:37:55.864812"]]
  ↳ app/controllers/skooter/odk_controller.rb:255
   (43.7ms)  COMMIT
  ↳ app/controllers/skooter/odk_controller.rb:255
image  ================ {"financial_page_image"=>"1565721267236.jpg"}
path  ================ /var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190813-79202-1ulro7l.jpg
  Disk Storage (15.3ms) Uploaded file to key: Dc8kVypDbmkKfC9wWiVKrQiP (checksum: ZdzLsDJlDRFcLtdUCTrOng==)
   (0.9ms)  BEGIN
  ↳ app/controllers/skooter/odk_controller.rb:255
  ActiveStorage::Blob Create (1.0ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "metadata", "byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["key", "Dc8kVypDbmkKfC9wWiVKrQiP"], ["filename", "1565721267236.jpg"], ["content_type", "image/jpeg"], ["metadata", "{\"identified\":true}"], ["byte_size", 3038981], ["checksum", "ZdzLsDJlDRFcLtdUCTrOng=="], ["created_at", "2019-08-13 20:37:55.949371"]]
  ↳ app/controllers/skooter/odk_controller.rb:255
   (41.7ms)  COMMIT
  ↳ app/controllers/skooter/odk_controller.rb:255
image  ================ {"financial_page_image"=>"1565721279636.jpg"}
path  ================ /var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190813-79202-19wtddw.jpg
  Disk Storage (15.3ms) Uploaded file to key: SXdChJUgv6KP5AimKsi51m1y (checksum: k2vsaTsVXn+P/E7uUNj0wg==)
   (0.7ms)  BEGIN
  ↳ app/controllers/skooter/odk_controller.rb:255
  ActiveStorage::Blob Create (1.2ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "metadata", "byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["key", "SXdChJUgv6KP5AimKsi51m1y"], ["filename", "1565721279636.jpg"], ["content_type", "image/jpeg"], ["metadata", "{\"identified\":true}"], ["byte_size", 2931139], ["checksum", "k2vsaTsVXn+P/E7uUNj0wg=="], ["created_at", "2019-08-13 20:37:56.045458"]]
  ↳ app/controllers/skooter/odk_controller.rb:255
   (41.5ms)  COMMIT
  ↳ app/controllers/skooter/odk_controller.rb:255
image  ================ {"financial_page_image"=>"1565721292231.jpg"}
Completed 500 Internal Server Error in 518ms (ActiveRecord: 171.8ms)



NoMethodError (undefined method `path' for nil:NilClass):
更新

下面是我添加时的输出:

放入“参数==================={params[image[:financial\u page\u image]}”


无法为某些图像创建对象。应用程序出现错误,因为
ActionDispatch::Http::UploadedFile
不存在。问题似乎在文件上传阶段。文件大小较大的图像可能会导致此错误。

您希望传递的参数是具有path方法的对象,这就是为什么会出现此错误
params
是对象的散列-所有对象都不应响应
path
。此
params[image[:report\u image]]
很难理解,您是否正在尝试访问params上的键?是不是
params[:image][:report\u image]
?您是否也可以显示
params
的完整输出?当您看不到日志是如何创建的时,跟踪日志也不容易。对于某些文件,无法创建ActionDispatch::Http::UploadedFile对象。应用程序出现错误,因为ActionDispatch::Http::UploadedFile不存在。问题似乎在文件上传阶段。可能是因为文件太大了吗?我没有对文件大小进行任何验证
financial_image_arr ======== [{"financial_page_image"=>"1565733645208.jpg"}, {"financial_page_image"=>"1565733658237.jpg"}, {"financial_page_image"=>"1565733673964.jpg"}, {"financial_page_image"=>"1565733688371.jpg"}]
params  ================ #<ActionDispatch::Http::UploadedFile:0x00007ffca0f4b290>
image  ================ {"financial_page_image"=>"1565733645208.jpg"}
path  ================ /var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190813-85337-ffz5sv.jpg
params  ================ #<ActionDispatch::Http::UploadedFile:0x00007ffca0f4b218>
image  ================ {"financial_page_image"=>"1565733658237.jpg"}
path  ================ /var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190813-85337-1fs8j1i.jpg
params  ================
image  ================ {"financial_page_image"=>"1565733673964.jpg"}
=======================XML Object=======================
### XML Object: {"has_assignment_card"=>"no", "assignment_name"=>"Pqpqpq", "set_assignment_id"=>"1", "has_organization_card"=>"no", "organization_name"=>"Pqpqpq", "set_organization_id"=>"1", "attendance_page_yes_no"=>"yes", "attendance_page_group"=>[{"attendance_page_image"=>"1565900276910.jpg"}, {"attendance_page_image"=>"1565900288347.jpg"}, {"attendance_page_image"=>"1565900306471.jpg"}], "attendance_data_yes_no"=>"no", "start"=>"2019-08-15T14:17:28.668-06:00", "end"=>"2019-08-15T14:18:32.940-06:00", "today"=>"2019-08-15", "deviceid"=>"353325097059590", "subscriberid"=>"706010493091431", "simserial"=>"8950301218077912618", "username"=>"peru_collector@test.com", "phonenumber"=>nil, "meta"=>{"instanceID"=>"uuid:e291337f-2da5-45e1-8990-c23a1f3adb5e", "instanceName"=>"Activity:  2019-08-15"}, "id"=>"activity", "xmlns:ev"=>"http://www.w3.org/2001/xml-events", "xmlns:orx"=>"http://openrosa.org/xforms", "xmlns:xsd"=>"http://www.w3.org/2001/XMLSchema", "xmlns:odk"=>"http://www.opendatakit.org/xforms", "xmlns:jr"=>"http://openrosa.org/javarosa", "xmlns:h"=>"http://www.w3.org/1999/xhtml"}
=======================XML Object=======================
  User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email", "peru_collector@test.com"], ["LIMIT", 1]]
  ↳ app/controllers/skooter/odk_controller.rb:31
  Program Load (0.7ms)  SELECT  "programs".* FROM "programs" WHERE "programs"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
  ↳ app/controllers/skooter/odk_controller.rb:31
image_arr ======== [{"attendance_page_image"=>"1565900276910.jpg"}, {"attendance_page_image"=>"1565900288347.jpg"}, {"attendance_page_image"=>"1565900306471.jpg"}]
puts "params[image[:attendance_page_image]]  ================ #<ActionDispatch::Http::UploadedFile:0x00007faa5bdd5560>
puts "params[image[:attendance_page_image]]  ================ #<ActionDispatch::Http::UploadedFile:0x00007faa5bdd44a8>
puts "params[image[:attendance_page_image]]  ================
  Rendering /Users/jefferson/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/bundler/gems/skooter-5bc83089cbef/app/views/skooter/odk/submissions.xml.erb
  Rendered /Users/jefferson/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/bundler/gems/skooter-5bc83089cbef/app/views/skooter/odk/submissions.xml.erb (0.5ms)
Completed 200 OK in 211ms (Views: 33.7ms | ActiveRecord: 11.1ms)
=======================XML Object=======================
### XML Object: {"has_assignment_card"=>"no", "assignment_name"=>"Pqpqpq", "set_assignment_id"=>"1", "has_organization_card"=>"no", "organization_name"=>"Pqpqpq", "set_organization_id"=>"1", "attendance_page_yes_no"=>"yes", "attendance_page_group"=>[{"attendance_page_image"=>"1565900276910.jpg"}, {"attendance_page_image"=>"1565900288347.jpg"}, {"attendance_page_image"=>"1565900306471.jpg"}], "attendance_data_yes_no"=>"no", "start"=>"2019-08-15T14:17:28.668-06:00", "end"=>"2019-08-15T14:18:32.940-06:00", "today"=>"2019-08-15", "deviceid"=>"353325097059590", "subscriberid"=>"706010493091431", "simserial"=>"8950301218077912618", "username"=>"peru_collector@test.com", "phonenumber"=>nil, "meta"=>{"instanceID"=>"uuid:e291337f-2da5-45e1-8990-c23a1f3adb5e", "instanceName"=>"Activity:  2019-08-15"}, "id"=>"activity", "xmlns:ev"=>"http://www.w3.org/2001/xml-events", "xmlns:orx"=>"http://openrosa.org/xforms", "xmlns:xsd"=>"http://www.w3.org/2001/XMLSchema", "xmlns:odk"=>"http://www.opendatakit.org/xforms", "xmlns:jr"=>"http://openrosa.org/javarosa", "xmlns:h"=>"http://www.w3.org/1999/xhtml"}
=======================XML Object=======================
  User Load (3.5ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email", "peru_collector@test.com"], ["LIMIT", 1]]
  ↳ app/controllers/skooter/odk_controller.rb:31
  Program Load (2.0ms)  SELECT  "programs".* FROM "programs" WHERE "programs"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
  ↳ app/controllers/skooter/odk_controller.rb:31
image_arr ======== [{"attendance_page_image"=>"1565900276910.jpg"}, {"attendance_page_image"=>"1565900288347.jpg"}, {"attendance_page_image"=>"1565900306471.jpg"}]
params[image[:attendance_page_image]] ================ #<ActionDispatch::Http::UploadedFile:0x00007faa61f88d20 @tempfile=#<Tempfile:/var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190815-11949-hqxxbg.jpg>, @original_filename="1565900276910.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"1565900276910.jpg\"; filename=\"1565900276910.jpg\"\r\nContent-Type: image/jpeg\r\nContent-Length: 2768335\r\n">
params[image[:attendance_page_image]] ================ #<ActionDispatch::Http::UploadedFile:0x00007faa61f887a8 @tempfile=#<Tempfile:/var/folders/zp/w8d7c5bs3glbprv_hs22m2k80000gn/T/RackMultipart20190815-11949-l9mkv.jpg>, @original_filename="1565900288347.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"1565900288347.jpg\"; filename=\"1565900288347.jpg\"\r\nContent-Type: image/jpeg\r\nContent-Length: 3848689\r\n">
params[image[:attendance_page_image]] ================ nil
  Rendering /Users/jefferson/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/bundler/gems/skooter-5bc83089cbef/app/views/skooter/odk/submissions.xml.erb
  Rendered /Users/jefferson/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/bundler/gems/skooter-5bc83089cbef/app/views/skooter/odk/submissions.xml.erb (0.4ms)
Completed 200 OK in 277ms (Views: 40.2ms | ActiveRecord: 19.4ms)
if record[:attendance_page_yes_no].eql?('yes')
  image_arr = record[:attendance_page_group]
  if image_arr.length > 1
    puts "image_arr ======== #{image_arr}"
    image_arr.each do |image|

      #puts "path ================ #{params[image[:attendance_page_image]].inspect}"
      #puts "name ================ #{image[:attendance_page_image]}"

      a.attendance_page_images.attach(io: File.open("#{params[image[:attendance_page_image]].path}"), filename: "#{image[:attendance_page_image]}")

    end if !image_arr.empty?
  else 
    a.attendance_page_images.attach(io: File.open("#{params[record[:attendance_page_group][:attendance_page_image]].path}"), filename: "#{record[:attendance_page_group][:attendance_page_image]}")
  end
end