[RUBY] Je veux introduire un comité avec des rails sans devenir trop sale

Aperçu

--Je voudrais introduire la validation des demandes et des réponses dans le comité pour ajouter une API pour publication publique au projet Rails.

manière

Ajoutez un comité à Gemfile et bundle install.

gem 'committee'

Tout ce que vous avez à faire est de créer une classe pour utiliser le comité et de l'appeler depuis Controller.

lib/public_api/committee_validator.rb


module PublicApi
  class CommitteeValidator
    attr_reader :request_object

    def initialize(request_object)
      @request_object = request_object
    end

    def committee_options
      {
        schema_path: Rails.root.join('schema', 'swagger.yml').to_s,
        prefix: '/public_api/v1'
      }
    end

    def validate_request!
      unless schema_validator.link_exist?
        request = "`#{request_object.request_method} #{request_object.path_info}` undefined in schema."
        raise Committee::InvalidRequest.new(request)
      end

      schema_validator.request_validate(request_object)
    end

    def validate_response!(status, headers, body)
      schema_validator.response_validate(status, headers, [body], true) if validate_response?(status)
    end

    def validate_response?(status)
      Committee::Middleware::ResponseValidation.validate?(status, committee_options.fetch(:validate_success_only, false))
    end

    def schema
      @schema ||= Committee::Middleware::Base.get_schema(committee_options)
    end

    def router
      @router ||= schema.build_router(committee_options)
    end

    def schema_validator
      @schema_validator ||= router.build_schema_validator(request_object)
    end
  end
 end

app/controllers/public_api/v1/base_controller.rb


module PublicApi
  module V1
    class BaseController < ApplicationController
      before_action :validate_request
      after_action :validate_response

      private

      def committee_validator
        @committee_validator ||= ::PublicApi::CommitteeValidator.new(request)
      end

      def validate_request
        committee_validator.validate_request!
      rescue Committee::InvalidRequest => e
        # render_bad_request
      end

      def validate_response
        committee_validator.validate_response!(response.status, response.headers, response.body)
      rescue StandardError => e
        Rails.logger.error("#{e.class}: #{ex.message}\n#{ex.backtrace.join("\n")}")
      end
   end
end

Après cela, sauvez-le bien et modifiez le processus selon les spécifications. Avec ce genre de sentiment, vous pouvez l'introduire tout en supprimant l'influence à l'extérieur de Public Api!

Recommended Posts

Je veux introduire un comité avec des rails sans devenir trop sale
Je veux jouer avec Firestore de Rails
[Rails] Je veux charger du CSS avec webpacker
Je souhaite utiliser le mode sombre avec l'application SWT
Je souhaite authentifier les utilisateurs auprès de Rails avec Devise + OmniAuth
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
[Rails] [bootstrap] Je souhaite modifier la taille de la police de manière réactive
Je veux pousser une application créée avec Rails 6 vers GitHub
[Avec des astuces de retour] Comment présenter React aux rails les plus simples
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Je veux passer la commande de démarrage à postgres avec docker-compose.
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
Je souhaite ajouter une fonction de navigation avec ruby on rails
Je veux revenir à l'écran précédent avec kotlin et java!
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Rails] Je souhaite ajouter des données aux paramètres lors de la transition avec link_to
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
[Rails / ActiveRecord] Je souhaite valider la valeur avant la conversion du type (_before_type_cast)
Je souhaite pouvoir lire des fichiers en utilisant refile avec administrate [rails6]
Je veux var_dump le contenu de l'intention
Code utilisé pour connecter Rails 3 à PostgreSQL 10
[Eclipse] Je veux utiliser la fonction de complétion, mais je veux réussir à confirmer la complétion avec un espace
Je veux tronquer après la virgule décimale
Je veux voir le contenu de Request sans dire quatre ou cinq
Essayez de résumer la disposition commune avec des rails
Je souhaite effectuer un traitement d'agrégation avec spring-batch
Je veux obtenir la valeur en Ruby
[Rails] Je veux tester avec RSpec. Nous soutenons votre démarche [Procédure d'introduction]
Je veux voir uniquement les dernières car le journal Docker est devenu trop volumineux
Je souhaite modifier le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils.
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je veux utiliser une petite icône dans Rails
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite surveiller un fichier spécifique avec WatchService
Je souhaite définir une fonction dans la console Rails
Rails6 J'ai essayé d'introduire Docker dans une application existante
Je veux faire des transitions d'écran avec kotlin et java!
Je veux appeler la méthode principale en utilisant la réflexion
Accro au Webpacker fourni en standard avec Rails 6
[Commentaire approximatif] Je veux épouser la méthode du pluck