2016-04-11 5 views
0

Je vais avoir une API de Raisin et je veux sauvegarder les données imbriquées.ActiveRecord :: AssociationTypeMismatch: Utilisateur (# 49785948) attendu, a obtenu Hashie :: Mash (# 52717320)

J'ai un modèle comme celui-ci:

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

    accepts_nested_attributes_for :user 
end 

Le api de raisin:

# 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 

Et voici mon fichier de test

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 

Le message est

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>' 

Qu'est-ce que je fais de mal? Est-ce la façon dont j'envoie les données ou est-ce ma structure/déclaration?

Répondre

0

Vous devez utiliser le mot-clé 'user_attributes' pour utiliser les attributs imbriqués. Donc, vous devez changer vos params bloc comme ceci:

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

Le fichier de test doivent changer en conséquence.