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
Réponse acceptée

Tu peux récupérer l'exception, et avec elle tu aura les informations : http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html

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 ?

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"
  }
}

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