2016-05-15 7 views
3

Also, ich bin in ein interessantes Thema geraten. In meinem Projekt habe ich eine Klasse namens "Builder". Wir haben diese App seit Jahren laufen und vor kurzem haben wir festgestellt, wir brauchten Twilio. Dies erfordert das Builder-Juwel (https://github.com/jimweirich/builder). Das Problem, das ich habe, ist, dass es ein Überschreiben der Namen gibt. Was kann ich tun, um sicherzustellen, dass ich Twilio verwenden und mit meiner Builder-Klasse fortfahren kann? Was ist der Weg des geringsten Widerstands für diesen Namensraum-Albtraum?Namespace-Problem zwischen Klasse in Projekt und Edelstein

+0

Was baut Ihr Builder? Ich würde das lösen, indem ich es in SomethingBuilder umbenenne. Wenn es zum Beispiel Apps erstellt, würde ich es AppBuilder nennen und mit meinem Projekt fortfahren. –

+3

Die Klassen Ihres Projekts sollten alle unter einem Modul mit demselben Namen wie Ihr Projekt benannt sein, z. Wenn Ihr Projekt Foo heißt, haben Sie Foo :: Builder. –

Antwort

2

Der gemeinsame Weg Namespace Kollisionen zu vermeiden, ist ein Namespace Ihrer eigenen zu verwenden:

module MyApp 
    class Builder 
    end 
end 

Das ist im Grunde, wie alle lohnt Rubin Edelsteine ​​geschrieben werden, wie es interoperateablilty möglich macht. Namespacing Zeug, das in das /lib Verzeichnis Ihrer Rails App geht, ist ziemlich schmerzlos. Namespacing all Ihrer Controller, Modelle usw. ist weniger angenehm. Es tötet einen guten Teil der "es funktioniert einfach" Schienen Magie.

explicity Namespacing Sachen wie:

namespace :api do 
    namespace :v1 do 
    resources :things 
    end 
end 

ist ziemlich geradlinig. Transparenter Namespacing ist jedoch ein wenig komplizierter - das bedeutet, dass der Code in einem Modul platziert wird, ohne Routen, Pfadhelfer oder Datenbanktabellennamen signifikant zu ändern.

können Sie Namespace-Controller mit:

scope module: 'my_app' do 
    resources :things 
end 

Welche würde Route zu MyApp::ThingsController ohne den Pfad oder Helfer zu beeinflussen. Sie würden den Controller in app/controllers/my_app/things_controller.rb platzieren.

+0

Wo würdest du vorschlagen, dass ich das ändere? In welcher Datei? – Red

+0

Weil ich einen anwendungsweiten Namespace machen müsste. Alle Controller, alle Modelle, alles. Leider wurde dies nicht vorhergesehen, als es entwickelt wurde. Aber ich muss so wenig Interior Code wie möglich ändern. Es ist zu spät im Spiel, um alles zu überholen und zu reparieren, und ich bin nicht der Besitzer des Projekts. – Red

+0

Vielleicht brauchen Sie nur die Builder-Klasse zu benennen - in diesem Fall würden Sie ein Modul hinzufügen, das die Klasse umschließt und sie nach /lib/my_app/builder.rb verschiebt – max