我正在开发一个API,当试图让RSpec请求测试通过时,我遇到了一个奇怪的行为/错误。尝试通过rails console
保存空记录时,我会收到错误消息,包括丢失的关联错误。
2.3.3 :006 > Breed.create().errors.messages
(0.2ms) begin transaction
(0.1ms) rollback transaction
=> {:specie=>["must exist"], :name=>["can't be blank"]}
但是当在控制器中将错误呈现给json时,如果我在尝试从API创建空参数时不包含空参数,则关联错误会消失。 有人能帮我理解为什么会这样吗?感谢。
应用程序/规格/请求/ breeds_spec.rb
describe 'PUT/PATCH #update' do
context 'when not successfull' do
before { patch breed_path(breed_id), params: { breed: { name: '' } } }
it "renders the errors on why the record could not be updated" do
puts json
expect(json['errors']).to have_key('name')
expect(json['errors']).to have_key('specie')
end
end
end
# => {"errors"=>{"name"=>["can't be blank"]}}
# Failure/Error: expect(json['errors']).to have_key('specie')
应用程序/控制器/ breeds_controller.rb
...
def create
@breed = Breed.new(breed_params)
if @breed.save
render json: @breed, status: :created, location: @breed
else
render json: { errors: @breed.errors }, status: :unprocessable_entity
end
end
...
应用程序/模型/ breeds.rb
# == Schema Information
# Table name: breeds
#
# name :string
# specie_id :integer
class Breed < ApplicationRecord
belongs_to :specie
validates :name, presence: true
end
总而言之,问题是为什么在通过rails控制台保存空记录时,错误看起来像=> {:specie=>["must exist"], :name=>["can't be blank"]}
,当将错误呈现给json时,它错过了关联错误=> {"errors"=>{"name"=>["can't be blank"]}}
答案 0 :(得分:0)
在Rails 5中,每当我们定义belongs_to关联时,它就是 默认情况下需要提供相关记录。
请参阅此thread
如果您希望它是可选的
belongs_to :specie, optional: true