2014-08-30 74 views
8

无论我如何格式化此请求的原始部分,我都无法避免下面的解析错误。如何构建邮递员请求的Rails POST方法

我有与传递规范中的一个方法创建一个Rails API,以表明控制器消息是声音:

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 

我使用邮递员尝试发布它。不管我怎么努力,我发现了错误:

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' 
} 

邮差请求设置:

screen cap of postman request

我也试过:

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

代码从创建方法和强参数申报power_ups_controller.rb

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 

回答

5

单引号(')在JSON中实际上不是合法的string delimiter:字符串必须用双引号(“)括起来。您可以在浏览器中使用它,因为它们是javascript中的字符串分隔符。您可以在IRB会议

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

此外,很容易复制此给你的天赋,你应该使用第二种形式即

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

你已经让我更接近它的出现。但是,我得到以下内容:'ActionController :: ParameterMissing(param丢失或值为空:power_up):'。我也尝试删除封闭的花括号。 – 2014-08-30 23:23:35

+0

这意味着数据与您的控制器设置的强参数要求不匹配。 – 2014-08-30 23:27:50

+0

我已经添加了强大的参数并创建了上面的方法。有一个怪癖,那就是'PowerUp'在模块“V1”中。 – 2014-08-30 23:44:50

9

对不起有点来不及回答,但可能帮助别人。

所有你需要做的是在你的请求头-(在邮递员或任何客户端)添加

Content-Type = 'application/json'

或者,你也可以卷曲尝试(来源):

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

+0

当我使用raw-json body时,我总是忘记添加'Content-Type:application/json' 。如果没有设置,我的参数不存在(在Rails控制器中)感谢您的答案,这一个让我很多! – mattLummus 2016-07-13 16:28:57

6

@Tejas Patel表示这是所有关于标题。但是,而不是明确设置它们你可以:

  1. 在请求创建区域切换到body标签。设置raw单选按钮。在下面的文字框中输入你的身体:

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

  2. 然后在下拉列表中选择分辩选项JSON (application/json),而不是默认Text选项。这将自动设置所需的标题。就是这样 - 你可以按“发送”按钮。