2012-08-09 8 views
18

Ich habe viel über das Thema gelesen und nichts scheint meine Bedürfnisse zu decken. Es tut mir leid, wenn ich etwas wiederhole oder nicht verstehe, dass ich sowohl neu in Ruby und Rails als auch neu in stackoverflow bin.Erstellen eines Edelsteins, der Schienenmodelle enthält

Ich habe eine bestehende Rails-Anwendung mit einer Menge Infrastruktur drin. Ich möchte ein paar seiner Modelle nehmen, sie in einem Namensraum verschachteln und all das in einen Rubin-Edelstein einfügen, um ihn in anderen Rails-Anwendungen zu verwenden. Nach meinem Verständnis gibt es ein Problem mit den Ladepfaden für Schienen, da dies eine Konvention und ein Problem bei der Definition einer anderen Maschine ist, denn dann haben Sie zwei und sie stürzen ab.

Ich habe nach einem Führer oder einer Anleitung gesucht, um zu lernen, wie man das ohne viel Glück macht, aber ich bin sicher, dass da draußen etwas ist, wenn mich jemand darauf hinweisen könnte.

Meine Versuche, ein Juwel mit einem Motor zu machen, scheitern bei Kollisionen oder fehlenden Schienen.

Ich laufe Schienen 3.2.3 und Rubin 1.9.3.

+1

Das Problem, das Sie beschreiben, wird normalerweise gelöst, indem Sie Ihren Code auf eine neue Rails-Engine umgestalten. Wie versuchen Sie, die Engine zu erstellen und welche Fehler erhalten Sie? – PinnyM

+1

Soweit ein Leitfaden, haben Sie [this] (http://edgeguides.rubyonrails.org/engines.html) oder [this] angeschaut (http://stackoverflow.com/questions/4993166/making-a- Benutzerdefinierte Plugin-Gem-Engine-for-Rails-3-App)? – PinnyM

+0

Ich werde versuchen und besser beschreiben, was ich versuche zu tun: Ich habe die Beispiel-App für das grundlegende Rails-Tutorial (das Blog) mit Posts, Kommentaren und Tags gemacht. Jetzt sage ich, ich möchte Tags nehmen und das zu einem Juwel machen, so dass jede Rails-App Tags zu jedem Modell hinzufügen kann. Was ich versuchte, war ein Edelstein mit allen Tags (Modell, Partialtöne, Migration) zu machen. Und ich installiere diesen Edelstein, dann wenn ich es brauche, werde ich rausgeworfen, zum Beispiel wenn ich irb (Beitrag in einem anderen Kommentar, weil ich ' m out off Zeichen – Shrewd

Antwort

1

Beginnen Sie mit diesem Handbuch - http://guides.rubyonrails.org/engines.html

einen Motor mit comand erstellen

$ rails plugin new "EngineName" --mountable 

als setzen Sie alles, was Sie benötigen, Modelle, Controller e.t.c in ihr Motor. Erzeuge Juwel daraus. Fügen Sie dieses Juwel zu Ihrer MasterApp hinzu. Alle Modelle sind unter dem Namespace EngineName verfügbar.

+1

Die Frage ist nicht nur, wie man ein montierbares Plugin erstellt, sondern auch Dinge, die zu dem Plugin hinzugefügt werden und stillschweigend im Hintergrund arbeiten . – Shrewd

17

Ja, Sie können ein Schmuckstück mit Modellen erstellen und diese in mehrere Rails-Anwendungen einbeziehen. Dies ist eine Möglichkeit, es zu tun:

  • ein Juwel erstellen: bundle gem demo_gem

  • erstellen oder Ihre Modelle zum demo_gem bewegen. Ich ziehe es vor, sie in lib/ Ordner des Edelsteins wie zum Beispiel demo_gem/lib/app/models/student.rb.

    module DemoGem 
        class Student < ActiveRecord::Base 
        end 
    end 
    
  • Erfordern alle Ihre Modelle in demo_gem/lib/demo_gem.rb

    require "demo_gem/version" 
    require "demo_gem/app/models/student.rb" 
    module DemoGem 
        # Your code goes here... 
    end 
    
  • Fügen Sie den Edelstein in Ihrer Rails-Anwendungen Gemfile (Ich gehe davon aus, dass der Code nicht ist Open Source, und Sie planen nicht, den Edelstein zu veröffentlichen):

    gem 'demo_gem', path: '../demo_gem' 
    

Jetzt können Sie diese Modelle überall in mehreren Schienenanwendung verwenden, nur indem Sie DemoGem::Student verwenden.

Hier wird angenommen, dass Sie eine einzelne Datenbank verwenden und dass die Tabellen existieren. Sie können jedoch im Edelstein selbst Migrationen erstellen und sie unter Verwendung von Rails generators in App kopieren.