[RUBY] Ich möchte ein Komitee mit Rails vorstellen, ohne zu schmutzig zu werden

Überblick

Weise

Fügen Sie ein Komitee zu Gemfile hinzu und installieren Sie das Paket.

gem 'committee'

Sie müssen lediglich eine Klasse erstellen, um das Komitee zu verwenden, und es vom Controller aus aufrufen.

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

Danach retten Sie es gut und ändern Sie den Prozess gemäß den Spezifikationen. Mit dieser Art von Gefühl können Sie es einführen und gleichzeitig den Einfluss auf die Außenseite von Public Api unterdrücken!

Recommended Posts

Ich möchte ein Komitee mit Rails vorstellen, ohne zu schmutzig zu werden
Ich möchte mit Firestore von Rails spielen
[Rails] Ich möchte CSS mit Webpacker laden
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte Benutzer mit Devise + OmniAuth bei Rails authentifizieren
Ich möchte die API mit Rails auf mehreren lokal eingerichteten Docker-Composes treffen
[Rails] [Bootstrap] Ich möchte die Schriftgröße entsprechend ändern
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
[Mit Backtricks] So stellen Sie React to the simple Rails vor
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
[Rails] Ich möchte beim Übergang mit link_to Daten zu Params hinzufügen
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
[Rails / ActiveRecord] Ich möchte den Wert überprüfen, bevor der Typ konvertiert wird (_before_type_cast).
Ich möchte in der Lage sein, Dateien mit refile mit administrate [rails6] zu lesen.
Ich möchte den Inhalt der Absicht var_dump
Code zum Verbinden von Rails 3 mit PostgreSQL 10
[Eclipse] Ich möchte die Abschlussfunktion verwenden, aber ich möchte es schaffen, den Abschluss mit einem Leerzeichen zu bestätigen
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
Versuchen Sie, das gemeinsame Layout mit Schienen zusammenzufassen
Ich möchte die Aggregationsverarbeitung mit Spring-Batch durchführen
Ich möchte den Wert in Ruby erhalten
[Rails] Ich möchte mit RSpec testen. Wir unterstützen Ihren Schritt [Einführungsverfahren]
Ich möchte nur das Neueste sehen, da das Docker-Protokoll zu groß geworden ist
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Ich möchte auch in Laradock Fischschalen verwenden! !!
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte ein kleines Symbol in Rails verwenden
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich möchte eine Funktion in der Rails Console definieren
Rails6 Ich habe versucht, Docker in eine vorhandene Anwendung einzuführen
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich möchte die Hauptmethode mit Reflektion aufrufen
Süchtig nach dem Webpacker, der standardmäßig mit Rails 6 geliefert wird
[Grober Kommentar] Ich möchte die Zupfmethode heiraten