我花了很长时间试图弄清楚我的Users控制器的POST行为在哪里弄乱了,我没有主意。
在命令行中输入json后,我一直从绑定撬回错误:
{"message"=>"Couldn't find User without an ID"}
这很奇怪,因为我只是在创建一个新用户。控制器user_params
与我在测试环境中创建的valid_attribute
有效负载匹配。
删除binding.pry
,我收到此错误:
1) Users API POST /users when the request is valid creates a user
Failure/Error: expect(json['username']).to eq('Tychus')
expected: "Tychus"
got: nil
(compared using ==)
我最初的GET测试似乎可以正常工作,所以我不确定为什么我的POST会出错。
任何帮助将不胜感激。
spec / requests / users_spec.rb
# Test suite for POST /users
describe 'POST /users' do
# valid payload
let(:valid_attributes) { { username: 'Tychus', password: 'password1' } }
context 'when the request is valid' do
before { post '/users', params: valid_attributes }
it 'creates a user' do
binding.pry
expect(json['username']).to eq('Tychus')
expect(json['password']).to eq('password1')
end
xit 'returns a status code of 201' do
expect(response).to have_http_status(201)
end
end
end
controllers / users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show, :create, :destroy]
# GET /users/:id
def show
json_response(@user)
end
# POST /users
def create
@user = User.create!(user_params)
binding.pry
json_response(@user, :created)
end
private
def user_params
params.permit(:username, :password)
end
def set_user
@user = User.find(params[:id])
end
end
问题是set_user
私有方法,它试图寻找id
。从:create
中删除before_action
解决了此问题。