2015-09-01 2 views
0

Je crée mon premier service Web en utilisant Grape et je suis confus par une chose. Comment répondre aux erreurs de validation d'ActiveRecord lorsqu'une requête POST ne réussit pas la validation AR?ActiveRecord Validation des erreurs dans l'API Grape

Dans mon modèle Foo j'ai ceci:

validates :bar, { 
     presence: true, 
     uniqueness: true 
    } 

Mon Foo Créer API dans Grape ressemble à ceci:

desc "Create a new Foo" 
params do 
    requires :bar, type: String, allow_blank: false 
end 
post do 
    ::Foo.create!({ 
    bar: params[:bar] 
    }) 
end 

À titre d'exemple, lorsque je crée un Foo avec double barre, je Je suis présenté avec une page d'erreur Rails standard (Using Postman). Comment puis-je m'assurer que toutes mes erreurs ne sont renvoyées qu'en tant qu'objets JSON?

PS. Je les instructions ci-dessous mis en place dans ma classe API:

default_format :json 
format :json 
formatter :json, Grape::Formatter::ActiveModelSerializers 

Répondre

2

Vous pouvez utiliser dans votre module API la méthode rescue_from avec un paramètre ActiveRecord::RecordInvalid que je considère comme un moyen plus élégant de réaliser ce que vous avez l'intention de faire. Passer un bloc à cette méthode vous permettra d'obtenir le message d'erreur et de le traiter plus avant. Vous obtiendrez ainsi une manière uniforme de traiter toutes les erreurs de validation. Par exemple:

rescue_from ActiveRecord::RecordInvalid do |error| 
    message = error.record.errors.messages.map { |attr, msg| msg.first } 
    error!(message.join(", "), 404) 
end 
0

Voici un exemple simple:

get "" do 
    begin 
     present Region.find(params[:id]) 
    rescue ActiveRecord::RecordNotFound => e 
     not_found_error(e) 
    end 
    end 

Je créé aide simple:

module YourApi::V1::ErrorsHelper 
    def not_found_error(e) 
    error!({ error: { message: "#{e.message}", error: "#{e.class} error", code: 404 }}, 404) 
    end 
end 

Ainsi, il suffit d'utiliser la méthode error! et gérer en utilisant la manière que vous voulez, avec le message, le type et le code.