2011-02-06 16 views
25
def create 
    req = ActiveSupport::JSON.decode(request.body) 
    if user = User.authenticate(req["email"], req["password"]) 
    session[:user_id] = user.id 
    render :json => "{\"r\": \"t\"}" + req 
    else 
    render :json => "{\"r\": \"f\"}" 
    end 
end 

'बनाने' विधि एक नियंत्रक में है और "/ लॉगिन" से मैप किया गया है, मैं सही सामग्री प्रकार की स्थापना कर रहा हूँ और मेरी कर्ल ग्राहक से हेडर स्वीकार करते हैं। मुझे हर समय 422 http स्थिति प्रतिक्रिया मिल रही है।पोस्ट json सर्वर रेल को

कोई सुझाव?

+3

हाथ से JSON उत्तर का निर्माण करने की कोई जरूरत नहीं: प्रस्तुत करना: json => {: r => "च"} as_json – tokland

उत्तर

45

यदि आप दाएं हेडर में भेज रहे हैं, तो आपको "ActiveSupport :: JSON.decode" करने की आवश्यकता नहीं होगी - रेल आपके लिए ऐसा करेंगे।

आपको अपनी पोस्ट में निम्नलिखित शीर्षलेख सेट करने होंगे।

Content-Type: application/json 
Accept: application/json 

ए 422 का मतलब असुरक्षित इकाई --- आम तौर पर एक सत्यापन विफलता थी।

आपको होना चाहिए। यदि आप नहीं कर सकते हैं, तो आपके शीर्षलेख सही ढंग से सेट नहीं हैं।

def create 
    if user = User.authenticate(params["email"], params["password"]) 
    session[:user_id] = user.id 
    render :json => "{\"r\": \"t\"}" + req 
    else 
    render :json => "{\"r\": \"f\"}" 
    end 
end 
+0

इतना सब मेरी json पोस्ट अनुरोध शरीर पैरामीटर [] हैश में स्वचालित रूप से रखा जाता है।? तो क्या मैं जेसन में अधिक गहरी ऑब्जेक्ट संरचनाओं का उपयोग कर सकता हूं और क्या उन्हें सही ढंग से पार्स किया जाएगा? – Rohan

+0

हां। गहरे ढांचे की आवश्यकता होगी कि आप अपने मॉडल में 'accepts_nested_attributes_for' सेट करें। (माता-पिता बच्चे के लिए स्वीकार करते हैं) –

+4

बीटीडब्लू, यदि आप सर्वर पर अनुरोध हेडर भेजते हैं, तो सुनिश्चित करें कि आप इसका उपयोग करते हैं: और नहीं =, जैसा कि: "सामग्री-प्रकार: एप्लिकेशन/जेसन" और "स्वीकार करता है: एप्लिकेशन/जेसन" – Ran

संबंधित मुद्दे