Rails 5.2应用程序
我正在通过POST从移动应用发送的XML对象中保存多个图像。
接收到的图像如下所示:
"image_group"=>
[
{"report_image"=>"1565721255925.jpg"},
{"report_image"=>"1565721267236.jpg"},
{"report_image"=>"1565721279636.jpg"},
{"report_image"=>"1565721292231.jpg"}
]
因此,这些图像属于报告。我将带有图像的报告保存在处理POST的控制器中。
我正在保存图像以使用以下代码块进行报告:
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_image没有提供路径。
这是错误:
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):
更新
这是我添加时的输出:
puts "params ================ #{params[image[:financial_page_image]]}"
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)
因此,您可以看到前两个图像带有参数,让我使用.path上传,但是最后一个没有参数。是零。
更新
这是将.inspect添加到参数时的输出:
=======================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
答案 0 :(得分:1)
ActionDispatch::Http::UploadedFile
对象。由于ActionDispatch::Http::UploadedFile
不存在,应用程序给出错误。问题似乎在文件上传阶段。文件大的图像可能会导致此错误。