2 Stimmen

Rails verwenden, um eine grafische Benutzeroberfläche für ein bestehendes CLI-Ruby-Skript zu erstellen?

Guten Tag, Leute,

Derzeit habe ich ein kleines philsophisches Rätsel. Myself und ein paar Kumpels haben eine ziemlich awesome Ruby CLI-Skript für Parsing und Verwaltung von Daten gebaut. Es verwendet Gems, antwortet auf Anfragen und ist voll funktionsfähig und großartig.

Ich wunderte mich, wenn es irgendeine Möglichkeit, ich könnte eine Singleton-Instanz dieser Klasse halten und interagieren mit ihm über eine Web-Schnittstelle in Schienen gebaut. Ich habe eine anständige Menge an Schienen Erfahrung, aber kann nicht für das Leben von mir herausfinden, wie wie eine Singleton-Instanz in einer Web-App zu erstellen und wie man das universell zugänglich für alle Klassen/Controller zu machen.

Der Grund, warum ich ein Singleton erstellen muss, ist, dass ich eine Reihe von Daten laden muss, die dieses kleine Skript zerhackt und ändert. Es ist klassenbasiert, aber ich möchte diese Klassen nicht auf Activerecord portieren, wenn ich es nicht muss, da es alles im Speicher hält (und nicht so viel Speicher benötigt).

Gibt es eine Möglichkeit, die ich nur importieren kann das Skript, starten Sie es mit den erforderlichen Befehlen und dann halten Sie dieses Objekt im Speicher für das Leben der Webanwendung, oder müsste ich über die Klassen/Methoden zu AR oder Controller-Methoden portieren?

Prost

1voto

Jacob Punkte 21787

Sie können einen Initialisierer hinzufügen, der eine Singleton-Verschalung für Ihr Objekt enthält:

config/initializers/foo_factory.rb:

require 'foo'
class FooFactory
  class << self
    def foo
      @@foo ||= Foo.new(lots, of, params)
    end
  end
end

Von überall sonst können Sie jetzt verwenden:

FooFactory.foo.do_something

Beachten Sie, dass es sich hierbei um besonders furchtbar und Sie sollten es wahrscheinlich nicht tun. Es wird jedoch tun, was Sie wollen: ein globales Singleton einrichten, das nur beim Serverstart eingerichtet wird.

Ein noch kürzerer Hack von ähnlicher Grausamkeit ist es, Ihre einzelne Foo-Instanz einer Konstanten zuzuweisen:

config/initializers/foo_singleton.rb:

require 'foo'
FooSingleton = Foo.new(lots, of, params)

Andernorts können Sie dann verwenden:

FooSingleton.do_something

Beachten Sie, dass dies im Grunde nur wenig besser ist als eine globale Variable, da Sie den Wert von FooSingleton nicht (einfach) ändern können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X