JSON没有在rails post中解析

时间:2014-11-23 02:53:47

标签: ruby-on-rails json rspec

在rails中我有一个JSON api我正在构建。在测试我的创建操作时,结果未正确解析。任何嵌套属性都在json中并且未解析。

参数内容

{"user"=>
  "\"id\":511,\"first_name\":\"Bryon\",\"last_name\":\"Hartmann\",\"email\":\"lexi@yahoo.com\",\"password_digest\":\"$2a$04$KeIkq/mRyxH2pLwjYW/EzuJCZMk4rHOLvnffyGjW8NwZhQkUubkWW\",\"admin\":false,\"created_at\":\"2014-11-23T02:38:38.487Z\",\"updated_at\":\"2014-11-23T02:38:38.487Z\"}",
 "controller"=>"api/users",
 "action"=>"create"}

实施例

# Controller Action
def create
  @user = User.new user_params

  if @user.save
    respond_with @user
  else
    error_message = { notice: @user.errors.full_messages }
    respond_with error_message, status: 401
  end
end

# Test
it 'responds with 200 on success' do
  user = build :user
  post :create, user: user.to_json

  expect(response).to be_success
  expect(response).to have_http_status(200)
end

1 个答案:

答案 0 :(得分:1)

构建REST api时的一个常见做法是将params作为普通的http属性发送。对于发布请求,可以在消息正文中对其进行编码(application / x-www-form-urlencoded)。

最好用以下curl命令解释:

curl --data "user[last_name]=testak&user[first_name]=chuck" http://example.com/users

你做了什么,但是这个:

curl --data "user=\{\"last_name\":\"Hartmann\, \"first_name\":\"Bryon\"}" http://example.com/users

对json有效负载的正确请求可能是:

curl --header "CONTENT_TYPE: application/json" --data "\{\"user\":\{\"last_name\":\"Hartmann\, \"first_name\":\"Bryon\"\}\}\" http://example.com/users

我个人更喜欢第一种选择,但这取决于api设计师。

为了将json有效负载转换为rails中的params散列,您可以将请求的Content-Type“标题设置为”application / json“

为了在rspec控制器测试中使用第一个选项,你可以:

 post :create, user: user.attributes

对于第二个选项,执行:

 post :create, user.to_json, "CONTENT_TYPE" => 'application/json'