2011-02-06 10 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 

'create'メソッドがコントローラにあり、 "/ login"にマップされています。正しいコンテンツタイプを設定していて、自分のカールクライアントからヘッダーを受け取ります。私は常に422のhttpステータス応答を得ています。POST json to rails server

提案がありますか?

+3

手でJSONレスポンスを構築する必要はありません:レンダリングは:JSON => {:R => "F"} 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 POSTリクエストボディが自動的のparams []ハッシュに入れていますか。?だから私はJSONのより深いオブジェクト構造を使用することができますし、それらは正しく解析されますか? – Rohan

+0

はい。より深い構造では、モデルに 'accepts_nested_attributes_for'を設定する必要があります。 (親は子供のために受け入れます) –

+4

ご要望のヘッダーをサーバーに送信する場合、「Content-Type:application/json」と 「Accepts:application/json」のようにnot = – Ran