Retourner JSON pour param is missing

Par TransientDev, il y a 10 ans


Bonjour,

Je réalise actuellement une API avec rails et sur certaines URLs je souhaiterais mettre des paramètres obligatoire
Actuellement je fais des tests pour me faire la main avant d'implémenter tout ça sur la vrai API et voici ce que j'ai:

class Api::PostsController < ApplicationController def index @posts = Post.all render json: posts: @posts end def create @post = Post.new(create_params) if @post.save render json: @post, status: :created else render json: @post.errors, status: :unprocessable_entity end end private def create_params params.require(:title) params.require(:content) params.permit(:title, :content) end end

Le soucis étant que s'il manque un paramètre j'ai le drois à une jolie erreur rails (en html), pour débugger c'est bien mais pour les clients qui vont communiquer un peu moins. Du coup je me demandais s'il y a un moyen de changer le format de réponse lors d'un *param is missing.

Merci d'avoir pris le temps de me lire,
Cordialement,
TD

4 réponses

Grafikart, il y a 10 ans

Quand tu met en environnement de production tu ne vois pas les erreurs mais tu sera dirigé vers une page d'erreur que tu peux personnaliser. C'est bien ce que tu veux ?

TransientDev, il y a 10 ans

A la base je pensais plutôt à une erreur comme celle générée par le model lorsqu'il manque un paramètre mais oui ça fonctionnerait aussi. Du coup est-il possible de récupérer les erreurs de l'objet request ou est-ce que je dois trouver un moyen de générer le message moi même? (En comparant les require et ce qui est reçu).

Car pour le moment j'arrive à intercepter l'exception et générer un message personnalisé

class Api::PostsController < ApplicationController rescue_from ActionController::ParameterMissing , :with => :param_missing #... def param_missing @params = params.to_json render :json => '{"error": "The param is missing","param":' + @params + '}', status: :not_found end

Mais je ne trouve pas comment récupérer le nom du paramètre posant problème

{ "error": "The param is missing", "param": { "title": "test", "format": "json", "controller": "api/posts", "action": "create" } }
TransientDev, il y a 10 ans

Effectivement, pourtant c'est logique que ce soit dans l'erreur... j'aurais du y penser ^^.
En tout cas merci beaucoup!
Bonne journée