2016-04-13 13 views
2

Meine Rails-Apps (Zusammenstellung von Rails 3 und 4) haben alle ihre eigene Datenbank (natürlich), greifen aber auch auf eine Datenbank von Drittanbietern zu. Als solche haben sie Modelle zu dieser 3rd-Party-Datenbank. Ich möchte diese Modelle als wiederverwendbar konfigurieren, anstatt sie in jede App kopieren zu können. Es gibt keine zu berücksichtigenden Controller, Helfer oder Routen. nur Modelle. Aber da es Rails "Teile" hat, würde dies darauf hinweisen, dass ich einen Motor brauche. Aber die Tatsache, dass ich diese Modelle in all meinen Apps habe, scheint darauf hinzudeuten, dass ich nur ein "normales" Rails-kompatibles Juwel brauche."Reguläre" Ruby Gem oder Rails Engine?

Wäre es besser, dies als Edelstein oder als Rails-Motor zu tun?

Wenn ein Motor besser ist, bin ich mir nicht sicher, wo ich anfangen soll. Aus einigen der Anleitungen, die ich gelesen habe, scheint es, als ob Sie in einer neuen Rails-Anwendung eine Engine erstellen. Ich bin auch etwas unklar auf full vs. mountable, aber ich weiß, dass ich diese Modelle in ihrem eigenen Namespace mögen würde.

Schließlich möchte ich diese Modelle in allen meinen Apps nutzbar machen. Engines kann als Edelstein verpackt werden, richtig? Wenn ja, könnte ich nicht einfach als Juwel beginnen, anstatt als Engine in einer bestimmten App zu starten und dann den Edelstein im Nachhinein zu exportieren?

Ich bin ziemlich verwirrt, so dass jede Rückmeldung geschätzt wird. Ich habe auch noch nie zuvor ein Juwel oder einen Motor gebaut, also verzeiht bitte jede Dummheit in diesem Bereich.

+0

Warum zeigt nichts anderes als Modelle an, dass Sie einen Motor brauchen? In jedem Fall, was "besser" ist, hängt davon ab, und der Rest ist furchtbar breit. Könnte es sinnvoll sein, mit etwas wie http://edgeguides.rubyonrails.org/engines.html zu beginnen und sehr spezifische Fragen zu stellen? –

+0

@DaveNewton: Entschuldigung, ich meinte das, weil es * irgendwelche * Rails "Teile" hatte, scheint es (für mich), dass es eine Engine sein sollte. – istrasci

+0

Vielleicht, obwohl ich nicht sicher bin, warum das sein würde.Wenn es ein Gem ist, können Sie es auch außerhalb von Rails verwenden (z. B. Kommandozeile util usw.), also tendiere ich dazu. –

Antwort

1

Engines sind nicht wirklich magisch, obwohl es leicht ist, diesen Eindruck zu bekommen. Im einfachsten Fall ist eine "Engine" eine gerade Unterklasse von Rails::Engine. Sobald es von Ihrer Rails-App geladen wird (zB require 'yourgem/engine), führen die Methoden in Ihrer Engine aus und verbinden Ihre Engine mit der Rails-Anwendung (einschließlich des magischen Anhängens einer Reihe von Pfaden innerhalb Ihrer Engine an die Lastpfade der Anwendungen wie die Modelle und Controller Ihrer Engine in Ihre App geladen werden).

Wenn Sie nun versucht haben, Getting Started With Rails Engines zu lesen, denken Sie wahrscheinlich, dass Sie keine Engine erstellen können, wenn Sie nicht die Rails-Generatoren verwenden und sich an die Rails-Konventionen halten. Aber das ist optional! Ich persönlich empfehle, ein normales Juwel zu schaffen und es zu einem Motor zu machen, hauptsächlich durch das Lesen der API docs, die viel nüchterner sind. Sogar das empfohlene Muster, in Ihrem Schmuckstück einen Ordner app zu haben, um Ihre Modelle und Controller oder Ähnliches zu halten, kann außer Kraft gesetzt werden (siehe Abschnitt Paths in der API-Dokumentation).

Also in Ihrem Fall, in dem Sie Ihren Motor enthalten Modelle nur wollen, würde ich wie so ein Juwel Layout vorschlagen:

yourgem/ 
    app/ 
    models/ 
     yourgem/ 
     your_thing.rb 
    db/ 
    migrate/ 
     20160413010101_create_models.rb 
    lib/ 
    yourgem/ 
     engine.rb 
     version.rb 
    yourgem.rb 
    yourgem.gemspec 

Ihre engine.rb ziemlich einfach sein kann:

# lib/yourgem/engine.rb 
module YourGem 
    class Engine < ::Rails::Engine 
    isolate_namespace YourGem # this is generally recommended 

    # no other special configuration needed. But maybe you want 
    # an initializer to be added to the app? Easy! 
    initializer 'yourgem.boot_stuff_up' do 
     YourGem.boot_something_up! 
    end 
    end 
end 

Und Ihre Migration und Ihre Modelle werden normal aussehen (denken Sie jedoch daran, dass Ihr Modell unter Ihrem Edelsteinnamen liegen muss, um Konflikte mit der App zu vermeiden, die diese Engine verwenden könnte).

Hoffe, dass hilft!

+0

Nun, Sie haben Motoren ein wenig mehr erklärt, aber meine ursprüngliche Frage bleibt unbeantwortet: Was ist der bessere Weg zu tun, was ich tun muss? Auch (vielleicht hast du es verpasst), ich habe keine Migrationen; nur Modelle. – istrasci

+0

@istrasci: So oder so, Sie müssen ein Juwel erstellen. Nun, sind Ihre Modelle Unterklassen von ActiveRecord :: Base oder einfach nur alte Ruby-Objekte? Wenn Letzteres, vergessen Sie alles über Motoren. Im ersten Fall würde ich vorschlagen, eine Engine zu verwenden, nur um die Abhängigkeit von Rails explizit zu machen (und Ihnen zu erlauben, sich beispielsweise in Initialisierer oder Generatoren einzuklinken). –

+0

Sie sind Unterklassen von ActiveRecord :: Base. Also, wenn ich eine Engine in einer meiner bestehenden Apps mache, wie "kompiliere" ich dann diese Engine zu einem Juwel, das meine anderen Apps verwenden können? – istrasci