2011-12-14 16 views
16

sonrası parametrelere doğru değil ayrıştırılır.Raylar JSON isteği ben Raylar JSON POST verilerini deşifre olmayan bir problemi ayıklamaya çalışıyorum

sunucu günlükleri gösterir: JSON dizesi ayrıştırılmıyordur olmadığını

2011-12-14T06:44:44+00:00 app[web.2]: Started POST 
2011-12-14T06:44:44+00:00 app[web.2]: Processing by PostsController#create as */* 
2011-12-14T06:44:44+00:00 app[web.2]: Parameters: {"{\"athlete_id\":\"\",\"known_as\":\"abc\",\"email\":\"[email protected]\",\"result\":\"112233\",\"rx\":false,\"mods\":\"thkjth\",\"notes\":\"\"}"=>nil, "affiliate_id"=>"testaffiliate", "wod_id"=>"12345"} 

Not - Raylar, karma bir anahtar olarak atama bir nil değerine işaret ediyor. JSON.parse tüm params anahtarlarını deneyen bir before_filter yazmadan önce herhangi bir fikri var mı?

Ben gönderip tamam verileri alıyorum çünkü bu alakalı olduğunu düşünmüyorum, ama bu sorunu (XDomainRequest kullanarak) IE Bir CORS Request sırasında oluşur.

cevap

9
before_filter :fix_ie_params, only: [:create, :update] 

İnce için:

def fix_ie_params 
    if request.format == '*/*' 
    # try to JSON decode in case of IE XDR 
    begin 

     params.merge! ActiveSupport::JSON.decode(request.body.string) 

    rescue Exception=>e 
     # todo: log exception 
    end 
    end 
end 

Phusion yolcu Unicorn için ve : Cevabınız için çok

def fix_ie_params 
    if request.format == '*/*' 
    # try to JSON decode in case of IE XDR 
    begin 

     request.body.rewind 
     params.merge! ActiveSupport::JSON.decode(request.body.read) 

    rescue Exception=>e 
     # todo: log exception 
    end 
    end 
end 
+0

Bunu yaparken (tek boynuzlu at) Ben bir anahtar olarak params içine dahil isteğin gövdesi: '{'theBodyOfRequest' => nil,: controller => users,: action => 'update'}' Bağlı Kullanım durumunuz bu sorunlara neden olabilir. İlk param olduğu gibi, onu kaldırmak için params.shift özelliğini ekledim. – Peter

+0

@collin, evet - POSTing olan veriler aslen JSON '{: foo =>" bar "}' dır (gönderilmek üzere gönderilmiştir), böylece denetleyicideki paramlar şöyle görünür: '{" {\ "foo \" => \ "bar \"} => nil, "controller" => "users" ...} ' – Peter

+0

@Peter, bu soruda anlattığım asıl sorun gibi geliyor, değil mi? filtreniz çalışıyor? – colllin

16

Content-Type başlığını için "application/json" ayarlayarak bu aşabiliriz. Denetleyicinin, Accept üstbilgisi "application/json" olarak ayarlandığında, ne beklemeyi beklediğini bilmesini sağlayabilirsiniz.

hem başlıklarıyla aşağıdaki komutu:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json" --header "Content-Type: application/json" 

günlüklerinde bu üretir:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json" 

bu üretir: Kabul başlığıyla

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:09:48 -0800 
    Processing by MyController#create as JSON 
    Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}} 
Completed 200 OK in 5ms (Views: 2.0ms | ActiveRecord: 0.0ms) 

Bu komut günlükler:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:07:26 -0800 
    Processing by MyController#create as JSON 
    Parameters: {"{ \"company\": { \"name\": \"acme\", \"address\": \"123 Carrot Street\" } }"=>nil} 
Completed 200 OK in 7ms (Views: 5.0ms | ActiveRecord: 0.0ms) 

Ve nihayet Content-Type başlığıyla bu komut:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:08:11 -0800 
    Processing by MyController#create as */* 
    Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}} 
Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.0ms) 

Bildirimi her biriyle ustaca çözümlenen parametreler ve işleme mesajı değişimi:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Content-Type: application/json" 

bu günlükleri üretir başlık türü.

+3

teşekkürler! Maalesef, XDomainRequest ile üstbilgilerde denetimim yok. (Öğeleri 3 ve 4 Bkz [Bu makale] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx).) Bu yüzden Bunun muhtemelen doğru cevap olduğunu düşünürüm, ama problemimi çözmüyor. Kontrolöre her şeyin bir JSON talebi olduğunu varsaymasını söyleyecek bir yol olup olmadığını biliyor musunuz? Ya da en azından varsayılan içerik türünü JSON'a mı ayarlayın? – colllin

+1

json ActionDispatch :: ParamsParser tutan ve ara katman bir parçasıdır params_parser.rb içinde (raylar 3.1), params üyesi ayrıştırılır alır. Gelen istek türünü engelleyen ve uygun şekilde ayarlayan başka bir ara katman parçası ekleyebilirsiniz. Bununla birlikte, eğer bunu yapacaksanız, belirli kodunuz için bunu yapmak için denetleyiciye biraz mantık koyabilirsiniz ve ara katman yığınının geri kalanını değiştirmeyebilirsiniz. – Grant