渲染到json

时间:2017-03-30 23:35:59

标签: ruby-on-rails ruby-on-rails-5 rspec-rails rspec3

我正在开发一个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"]}}

1 个答案:

答案 0 :(得分:0)

  

在Rails 5中,每当我们定义belongs_to关联时,它就是   默认情况下需要提供相关记录。

请参阅此thread

如果您希望它是可选的

belongs_to :specie, optional: true