2011-02-06 2 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», я устанавливаю правильные типы контента и принимаю заголовки от моего curl-клиента. Я получаю ответ 422 http status all.POST json to rails server

Любые предложения?

+3

нет необходимости строить ответ JSON вручную: вынести: JSON => {: г => "е"} as_json – tokland

ответ

45

Если вы отправляете правильные заголовки, вам не нужно будет делать «ActiveSupport :: JSON.decode» - рельсы сделают это за вас.

Вам необходимо установить следующие заголовки в своем сообщении.

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

A 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

BTW, если вы отправляете заголовки запросов на сервер, убедитесь, что вы используете: и not =, как в: «Content-Type: application/json» и «Accepts: application/json» – Ran