2016-06-14 9 views
2

Ich erstelle eine Rails-Engine für eine Anwendung, an der ich arbeite.Rails mounted engine Verwendung DB-Schema aus der Hauptanwendung

Grundsätzlich ist die Anwendung in zwei Abschnitte aufgeteilt:

  1. Privat
  2. öffentliche

Die private Seite die Hauptanwendung ist, wo all Admin-Funktionalität Leben und die öffentliche Website (Motor) sollte in der Lage sein, über die private App auf die Modelle zuzugreifen.

Es klingt wie es in umgekehrter Richtung zu mir, aber das ist, was die Spezifikation fordert.

Ich weiß, im Allgemeinen Sie ein Motormodell in der Haupt App als solche zugreifen würden:

EngineName- :: Modell

Wie würde ich die Hauptanwendung im Innern des Motors zugreifen?

Beispiel:

Ein privater Nutzer gehen würde, um foo.bar/videos/new und ein neues Video zu erstellen.

Ein öffentlicher Benutzer würde zu foo.bar/public/videos gehen und Zugang zu diesen Videos haben.

+0

Das Teilen der Funktionalität in private und öffentliche Abschnitte ist sinnvoll, aber warum erfordert diese Situation, dass Sie das Engine-Muster verwenden? – declan

+1

Ich denke, es ist eine gute Frage, aber es scheint, als würdest du durch unnötige Hürden springen. Was versuchst du wirklich zu erreichen, indem du es so machst, abgesehen davon, dass du die "Spezifikation" erfüllst? Wurde die Spezifikation von einem Programmierer geschrieben? –

+0

Normalerweise würde ich Funktionalität in eine Engine packen, weil ich sie woanders wiederverwenden möchte. Wenn die Engine Aufrufe zum Codieren von der Hostanwendung enthält, ist sie nicht wiederverwendbar. In diesem Fall bin ich neugierig darauf, welchen Nutzen Sie daraus ziehen, es als Engine zu schreiben. Wenn Sie nur eine klare Linie zwischen dem, was öffentlich ist, und dem, was privat ist, zeichnen möchten, könnte es [einfacher, einen Namespace zu verwenden] ( – declan

Antwort

1

Ich habe das gerade getestet und war in der Lage, Code aus der Host-Anwendung in einer Engine ohne Probleme zu referenzieren.

# In the main application 
# lib/test_library.rb 
TestLibrary 
    def self.say_something 
    "Hello! I am defined in the host application, not the Engine." 
    end 
end 

# Then, inside the engine 
# app/views/your_engine_name/some_resource/index.html.erb 
<%= TestLibrary.say_something %> 

Dies druckt einfach in der Engine-Vorlage. Wenn Sie also ein Video Modell haben, können Sie sich auf den Controller in Ihrer Engine beziehen, genauso wie Sie es tun würden, wenn der Controller Teil Ihrer Anwendung wäre.

Mit dem gesagt, ich bin mir nicht sicher, ob das Engine-Muster das beste für Ihre Anforderungen ist.

Wenn Sie auf diese Weise schreiben, können Sie den Engine-Code nicht an anderer Stelle wiederverwenden. Wenn Wiederverwendung nicht das ist, was Ihnen wichtig ist, dann ist eine Engine wahrscheinlich eine schwerere Lösung als Sie benötigen. Sie könnten eine namespace verwenden.

+0

) Danke und ja, ich stimme vollkommen zu, dass ein Namensraum mehr Sinn macht, aber mein Teamleiter will es so machen und ich schätze deine Lösung! – sump