Ich bin ziemlich neu in Ruby, komme von einem PHP-Hintergrund, aber etwas klickt nicht mit mir.
Nehmen wir an, ich habe eine Ruby on Rails-Anwendung und versioniere meine API wie folgt:
%Vor%Mit der Klassenstruktur mit
%Vor% Die Frage ist also, sucht Ruby für Api::V1::ApplicationController
, Api::ApplicationController
oder ApllicationController
für die Erweiterung?
Stimmt der < ApplicationController
auf seinen eigenen Namespace ab, wenn ich nicht Api::ApplicationController
vorschlage? Wenn ja, wie lege ich den Root fest?
Wenn Sie
verwenden %Vor% ApplicationController
definition wird in Api::V1
gesucht, wenn nicht in Api
gefunden, wenn nicht im Stamm-Namespace gefunden.
Ich stimme zu, dass es verwirrend sein könnte, deshalb verwende ich absolute Pfade wie folgt: ::ApplicationController
Wenn ich jemals Api::ApplicationController
brauche, schreibe ich ::Api::ApplicationController
Grundsätzlich sagt ::
ruby, dass es vom Root-Namespace startet und nicht von wo der Code lebt.
Randnotiz
Beachten Sie, dass es im Rails-Entwicklungsmodus bösartige Fälle gibt. Um Geschwindigkeit zu gewinnen, wird das strikte Minimum geladen. Dann sucht Rails bei Bedarf nach Klassendefinitionen.
Aber dies schlägt manchmal fehl, wenn Sie ::User
bereits geladen haben und dann nach ::Admin::User
suchen. Rails würde nicht danach suchen, es wird denken, ::User
macht den Trick.
Dies kann mit require_dependency
-Anweisungen in Ihrem Code gelöst werden. Geschwindigkeit hat einen Preis:)
Ich würde eher vorschlagen, nicht ApplicationController
in Namespace schreiben, ich würde vorschlagen, folgen
Hinweis: Wenn Sie professionelle APIs erstellen, ist es immer gut, wenn Api::V1::BaseController
von ActionController::Base
erbt, obwohl ich Ihrem speziellen Fall eine Lösung gebe
Ref diesen Beitrag: Implementierung von Rails-APIs wie ein Profi
1) Definieren Sie den Application Controller wie gewohnt in app / controllers / application_controller.rb als
%Vor% 2) Definieren Sie den Basis-API-Controller Api :: V1 :: BaseController in app / controllers / api / v1 / base_controller.rb, der von ApplicationController
(Ihrem Fall) wie
3) Definieren Sie Ihre API-Controller wie Api::V1::UsersController
in app / controllern / api / v1 / users_controller.rb, die von Api :: V1 :: BaseController
4) Fügen Sie alle nachfolgenden Controller wie Api::V1::UsersController
(Schritt 3)
Dann wird routing das Namespaces-Routing in config / routes.rb
enthalten %Vor%Sie sollten die Anleitung überprüfen, um das Routing zu verstehen: Ссылка
Ich denke, diese Frage ist sehr ähnlich zu:
Und als Mangel:
Rails erkennt den Namespace automatisch nach dem Ordner. Sie müssen es also nicht an den Namen anhängen:
Dieser Blogeintrag erklärt es so gut:
Nehmen wir an, wir haben eine Rechnung-Klasse und jede Rechnung kann mehrere haben Rechnungspositionen:
%Vor%Offensichtlich ist die Rechnung eine Zusammensetzung von Gegenständen und ein Gegenstand kann nicht leben ohne eine enthaltene Rechnung. Andere Klassen werden wahrscheinlich interagieren mit Rechnung und nicht mit Artikel. Also lass uns Item aus der durch Verschachteln in den Invoice-Namespace. Dies beinhaltet das Umbenennen die Klasse zu Invoice :: Item und Verschieben der Quelldatei nach App / Modelle / Rechnung / item.rb:
%Vor%
Gleiches gilt für Controller und Ansichten.
Tags und Links ruby namespaces ruby-on-rails