Tôi biết có những câu hỏi tương tự câu hỏi này nhưng tôi chưa tìm thấy câu trả lời hay. Những gì tôi cần làm là gửi một mô tả của một đối tượng đến một trong các phương pháp tạo của tôi, trong đó bao gồm một số thuộc tính khác nhau trong đó có một tên là: hình ảnh, tập tin đính kèm kẹp giấy:Gửi tệp tới API JSON Rails
has_attached_file :image
Bây giờ tôi đã đọc rằng việc gửi hình ảnh có thể được thực hiện thẳng trong JSON bằng cách mã hóa và giải mã hình ảnh dưới dạng base64, nhưng cảm giác đó giống như một giải pháp bẩn đối với tôi. Phải có cách tốt hơn.
Một giải pháp khác là gửi yêu cầu nhiều phần/dữ liệu biểu mẫu, giống như yêu cầu LEEjava describes here. Vấn đề với thông số đó là các tham số yêu cầu không được diễn giải chính xác trong Rails 3.2.2 và JSON.parse sẽ phát ra lỗi khi nó cố gắng phân tích các thông số, hoặc có lẽ đó là Rails giải thích sai điều gì đó.
Started POST "/api/v1/somemodel.json?token=ZoipX7yhcGfrWauoGyog" for 127.0.0.1 at 2012-03-18 15:53:30 +0200 Processing by Api::V1::SomeController#create as JSON Parameters: {"{\n
\"parentmodel\": {\n \"superparent_id\": 1,\n
\"description\": \"Enjoy the flower\",\n \"\": "=>{"\n
{\n \"someattribute\": 1,\n
\"someotherattribute\": 2,\n \"image\": \"image1\"\n
}\n "=>{"\n }\n}"=>nil}}, "token"=>"ZoipX7yhcGfrWauoGyog"}
Thật khó để đọc điều đó, xin lỗi. JSON.parse (params [: parentmodel]) là không thể ở đây, và tôi có thể không JSON.parse (params) hoặc do các thuộc tính thẻ, JSON.parse (params) throws lỗi này:
TypeError (can't convert ActiveSupport::HashWithIndifferentAccess into String)
Điều này khiến tôi tin rằng tôi đang tiếp cận vấn đề này hoàn toàn sai, hoặc tôi chỉ đang làm điều gì đó. Dù bằng cách nào, chúng tôi có thể chắc chắn rằng tôi sai về điều gì đó. :)
Có cách nào tốt hơn để thực hiện việc này không? Ai đó có thể chỉ cho tôi bất kỳ hướng dẫn/hướng dẫn nào hay viết câu trả lời mô tả cách tôi nên tiếp cận điều này?
Cảm ơn bạn trước
UPDATE: Vì vậy, tôi đã thực sự nhận nó làm việc bây giờ, nhưng chỉ trong các thử nghiệm. Tôi không hoàn toàn chắc chắn làm thế nào điều này hoạt động, nhưng có lẽ ai đó có thể điền vào những khoảng trống cho tôi? Đây là một phần của mã thử nghiệm (hình ảnh: fixture_file_upload (...) là phần quan trọng).
parts_of_the_object = { someattribute: 0, someotherattribute: 0, image: fixture_file_upload('/images/plot.jpg', 'image/jpg') }
params của tôi [] trông giống như một hình thức HTML bình thường đã được gửi, đó là lạ (và tuyệt vời):
Parameters: {"superparentid"=>"1", "plots"=>[{"someattribute"=>"0", "someotherattribute"=>"0", "image"=>#<ActionDispatch::Http::UploadedFile:0x007f812eab00e8 @original_filename="plot.jpg", @content_type="image/jpg", @headers="Content-Disposition: form-data; name=\"plots[][image]\"; filename=\"plot.jpg\"\r\nContent-Type: image/jpg\r\nContent-Length: 51818\r\n", @tempfile=#<File:/var/folders/45/rcdbb3p50bl2rgjzqp3f0grw0000gn/T/RackMultipart20120318-1242-1cn036o>>}], "token"=>"4L5LszuXQMY6rExfifio"}
Yêu cầu được thực hiện chỉ thích và bài yêu cầu được thực hiện với rspec:
post "/api/v1/mycontroller.json?token=#{@token}", thefull_object
Vì vậy, tôi đã hoàn thành công việc. Tôi chỉ không biết chính xác nó hoạt động như thế nào! Tôi cũng muốn tự mình tạo ra một phản ứng như thế này, không chỉ từ RSpec. :-)
Hãy cho tôi biết nếu nó không hoạt động trong chế độ dev/prod của bạn, tôi đã tìm ra giải pháp cho điều này vài ngày trước nhưng đã quên ot để viết một câu trả lời. Nó khá giống với của bạn, chỉ tôi đang làm nó trong mô hình (gửi dữ liệu Base64 ngay vào một thuộc tính image_data). Tôi thích giải pháp của bạn hơn. Hãy cho tôi biết làm thế nào nó đi và tôi sẽ giúp đỡ nếu tôi có thể. –
Từ những gì tôi có thể nhìn thấy câu trả lời là chính xác vì vậy tôi đang trao tiền thưởng. –
Đây là một câu trả lời hay, nhưng ít nhất trong Rails 3/Ruby 1.9 có một số lỗ nhỏ. Trước tiên, đảm bảo bạn 'tempfile.rewind()' sau khi bạn viết, nếu không bạn sẽ nhận được tệp có độ dài 0. – Shannon