2016-04-06 3 views
0

Je rencontre un problème pour enregistrer l'attribut sérialisé de mon modèle. J'ai une API grape avec cette fonction dans ma classe.Attribut sérialisé de l'API Grape

# app/controllers/api/v1/vehicules.rb 
module API 
    module V1 
    class Vehicules < Grape::API 
     include API::V1::Defaults 
     version 'v1' 
     format :json 

     helpers do 
     def vehicule_params 
      declared(params, include_missing: false) 
     end 
     end 

     resource :vehicules do 

     desc "Create a vehicule." 
     params do 
      requires :user_id, type: String, desc: "Vehicule user id." 
      requires :marque, type: String, desc: "Vehicule brand." 
     end 
     post do 
      #authenticate! @todo 
      Vehicule.create(vehicule_params) 
     end 

Mon modèle est comme si

class Vehicule < ActiveRecord::Base 
    serialize :marque, JSON 

Lorsque je crée un véhicule dans la console comme vehicule = Vehicule.create(user_id: 123, marque: {label: "RENAULT"} il fonctionne très bien.

Mais lorsque je tente d'envoyer une demande: curl http://localhost:3000/api/v1/vehicules -X POST -d '{"user_id": "123", "marque": {"label": "RENAULT"}}' -H "Content-Type: application/json" J'ai ce message d'erreur:

Grape::Exceptions::ValidationErrors 
marque is invalid, modele is invalid 

grape (0.16.1) lib/grape/endpoint.rb:329:in `run_validators' 

Si je l'envoie avec "marque": "{label: RENAULT}" cela fonctionne, mais il est enregistré dans db comme marque: "{label: RENAULT}" et il devrait être marque: {"label"=>"RENAULT"} que je veux marque['label'] pour renvoyer RENAULT.

Comment puis-je envoyer les données?

Répondre

0

J'ai simplement dû changer dans le contrôleur grape le type de l'attribut.

desc "Create a vehicule." 
    params do 
    requires :user_id, type: Integer, desc: "Vehicule user id." 
    requires :marque, type: Hash, desc: "Vehicule brand." 
    end 
    post do 
    #authenticate! @todo 
    Vehicule.create(vehicule_params) 
    end 

Et pour tester, vous pouvez faire comme ça.

test "PUT /api/v1/vehicules/1" do 
    put("/api/v1/vehicules/1", {"id" => 1,"user_id" => 1,"marque" => {"label" => "RENAULT"}}, :format => "json") 
    assert(200, last_response.status) 
    vehicule = Vehicule.find(1) 
    assert_equal("RENAULT", vehicule.marque['label'], "La marque devrait être") 
end