2014-08-30 28 views
8

Bu isteğin ham kısmını nasıl biçimlendirdiğim önemli değil, aşağıdaki ayrıştırma hatasını önleyemiyorum. Rails POST yöntemi için postacı isteği nasıl oluşturulur

I denetleyici mesajı sağlam olduğunu göstermek için, spec geçen bir oluşturma yöntemi ile bir Raylar API sahiptir: bunun POST deneyin Postacı kullanıyorum

describe "POST power_up" do 

    let!(:client) { FactoryGirl.create :client, name: "joe", auth_token: "asdfasdfasdfasdfasdfasdf" } 

    it "should create and save a new Power Up" do 

     expect { post :create, format: :json, power_up: FactoryGirl.attributes_for(:power_up) }.to change(V1::PowerUp, :count).by(1) 
    end 

    end 

. Ne olursa olsun ben denemek ne hatayı alıyorum:

Started POST "/v1/power_ups.json" for 127.0.0.1 at 2014-08-30 18:05:29 -0400 
Error occurred while parsing request parameters. 
Contents: 

{ 
    'name': 'foo', 
    'description': 'bar' 
} 


ActionDispatch::ParamsParser::ParseError (795: unexpected token at '{ 
    'name': 'foo', 
    'description': 'bar' 
} 

Postacı isteği hazırlığı: Ben de denedim

screen cap of postman request

:

{ 
    'power_up': { 
    'name': 'foo', 
    'description': 'bar' 
    } 
} 

Kod yöntemini oluşturmak gelen ve power_ups_controller.rb numaralı telefondaki güçlü parametreler beyanı:

def create 
    @power_up = PowerUp.new(power_up_params) 

    if @power_up.save! 
    redirect_to @power_up 
    end 
end 

private 

    def power_up_params 
    params.require(:power_up).permit(:name, :description) 
    end 

cevap

5

JSON'daki tek tırnak işaretleri (') aslında string delimiter yasal değildir: bir dize çift tırnak içine alınmalıdır ("). Javascript'te dize sınırlayıcıları olduğundan, tarayıcıda bunlardan kurtulabilirsiniz. Kolayca bu cevap yani

{ 
    "power_up": { 
    "name": "foo", 
    "description": "bar" 
    } 
} 
+0

Beni daha yakınına taşıdınız. Ancak aşağıdakileri elde ediyorum: 'ActionController :: ParameterMissing (param eksik veya değer boş: power_up):'. Ayrıca çevreleyen küme parantezlerini çıkarmaya çalıştım. –

+0

Bu, verilerin, denetleyicinizin ayarladığı güçlü parametre gereksinimleriyle eşleşmediği anlamına gelir. –

+0

Güçlü paramları ekledim ve yukarıdaki yöntemleri oluşturdum. Bir quirk var, 'PowerUp'' V1'de bir modül var. –

9

Maalesef biraz geç ikinci formu kullanarak gerektiğini fakat başkası yardımcı olabilir spec verilen bir irb oturumda ek olarak

JSON.parse(%q[{'foo': 'bar'}]) #=> raises JSON::ParserError 
JSON.parse(%q[{"foo": "bar"}]) #=> ok 

uygulamak üzere.

yapmanız gereken tek şey

Alternatif Content-Type = 'application/json'

, ayrıca kıvrılma ile deneyebilirsiniz ekleyin (kaynak) (postacı ya da her türlü müşteri olarak) sizin istek başlığında - geçerli:

curl -X POST -H "Content-Type: application/json" -d '{"power_up": { "name": "foo", "description": "bar" } }' 127.0.01:3000/v1/power_ups.json

+0

Ham-json gövdesini kullanırken her zaman 'Content-Type: application/json' eklemeyi unutuyorum. Eğer ayarlanmadıysa, paramlarım mevcut değil (Rails kontrolöründe). Cevabınız için teşekkürler, bu bana çok şey katıyor! – mattLummus

6

@Tejas Patel tarafından her şey başlıklarla ilgili olduğunu söyledi. Ama bunun yerine bunları açıkça ayarlama sadece can: body sekmesine istek yaratma alanı anahtarı olarak

  1. . raw radyo düğmesini ayarlayın. alt metin alanı girişinde vücudunuzun: { "power_up": { "name": "foo", "description": "bar" } }

  2. Sonra rigth bir açılır listede JSON (application/json) seçeneği yerine varsayılan Text seçenek seçin. Bu gerekli üstbilgileri otomatik olarak ayarlayacaktır. İşte bu - "Gönder" düğmesine basabilirsiniz.