ActiveRecord :: AssociationTypeMismatch:用户(#49785948)预计,得到Hashie :: Mash(#52717320)

时间:2016-04-11 14:08:01

标签: activerecord nested-attributes grape

我有一个Grape api,我想保存嵌套数据。

我有一个这样的模型:

class Vehicule < ActiveRecord::Base
  before_validation :set_principal, :if =>:new_record?
  belongs_to :user

  accepts_nested_attributes_for :user
end

葡萄api:

# app/controller/api/v1/vehicules.rb
resource :vehicules do
  desc "Update a vehicule."
    params do
      optional :confort, type: Float, desc: ""
      optional :user, type: Hash do
        optional :name, type: String
      end
  end
  put ':id' do
    #authenticate! @todo
    Vehicule.find(params[:id]).update(vehicule_params)
  end

这是我的测试文件

test "PUT /api/v1/vehicules/1" do
  put("/api/v1/vehicules/1", { 'confort' => 3.4, 'user' => {'name' => 'name changed'} }, :format => "json")
  assert(200, last_response.status)
  vehicule = Vehicule.find(1)
  assert_equal('name changed', vehicule.user.name, "Le nom de l'utilisateur aurait dû changer")
end

消息是

  1) Error: API::V1::VehiculesTest#test_PUT_/api/v1/vehicules/1: ActiveRecord::AssociationTypeMismatch: User(#49785948) expected, got Hashie::Mas h(#52717320)
    app/controllers/api/v1/vehicules.rb:38:in `block (2 levels) in <class:Vehicu les>'
    test/controllers/api/v1/vehicules_test.rb:18:in `block in <class:VehiculesTe st>'

我做错了什么?是我发送数据的方式还是我的结构/声明?

1 个答案:

答案 0 :(得分:0)

您必须使用'user_attributes'关键字才能使用嵌套属性。所以你必须像这样改变你的params块:

  params do
    optional :confort, type: Float, desc: ""
    optional :user_attributes, type: Hash do
      optional :name, type: String
    end
  end

测试文件必须相应更改。