Ruby Namensraum

8

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?

    
GingerTech 28.04.2015, 12:57
quelle

3 Antworten

16

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:)

    
apneadiving 28.04.2015, 13:02
quelle
2

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

erbt %Vor%

3) Definieren Sie Ihre API-Controller wie Api::V1::UsersController in app / controllern / api / v1 / users_controller.rb, die von Api :: V1 :: BaseController

erben werden %Vor%

4) Fügen Sie alle nachfolgenden Controller wie Api::V1::UsersController (Schritt 3)

hinzu

Dann wird routing das Namespaces-Routing in config / routes.rb

enthalten %Vor%     
Pramod Shinde 28.04.2015 13:17
quelle
0

Sie sollten die Anleitung überprüfen, um das Routing zu verstehen: Ссылка

Ich denke, diese Frage ist sehr ähnlich zu:

Rails Controller-Namespace

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.

    
tebayoso 28.04.2015 13:05
quelle

Tags und Links