2011-02-06 26 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' yöntemi denetleyicisi olduğu raylar ve "/ login" eşleştirilmiş, ben doğru içerik türleri kuruyorum ve benim bukle istemciden başlıklarını kabul etmek. Her zaman 422 http durum yanıtı alıyorum.POST json sunucuyu

Herhangi bir öneriniz var mı?

+3

elle JSON yanıtını oluşturmak için gerek: render: json => {: r => "f"} as_json – tokland

cevap

45

Eğer doğru başlıklarda gönderiyorsanız, o zaman "ActiveSupport :: JSON.decode" yapmanıza gerek kalmayacak - raylar sizin için bunu yapacaktır.

Gönderinizde aşağıdaki üstbilgileri ayarlamanız gerekir. Bir 422

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

İşlenebilir varlık anlamına gelmektedir --- genellikle bir doğrulama başarısız olduğunu.

Yapabilmeniz gerekir. Eğer yapamıyorsanız, başlıklarınız doğru ayarlanmamıştır.

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

böylece tüm json POST isteği vücut otomatik olarak params [] karma konur.? Yani jsonda daha derin nesne yapıları kullanabilir ve doğru şekilde ayrıştırılır mı? – Rohan

+0

Evet. Daha derin yapılar, modellerinizde 'accepts_nested_attributes_for' ayarlanmasını gerektirir. (ebeveyn, çocuk için kabul eder) –

+4

BTW, istek başlıklarını sunucuya gönderirseniz, aşağıdakileri kullandığınızdan emin olun: ve değil, gibi: "İçerik Türü: uygulama/json" ve "Kabul eder: application/json" – Ran