2010-04-28 7 views
19

ich mehrere Methoden habe ich von meinem Controller aufrufen, die sie glauben, wie und in eine wiederverwendbare Klasse setzen gezogen werden sollte, außerhalb des Controllers. Wo legen die Leute das Zeug hin? Ich weiß, dass ich sie in meinen ApplicationController legen kann, aber das scheint keine gute Lösung zu sein, wenn ich denke, dass ich diese Methoden später in anderen Anwendungen verwenden kann.Wo setzen wieder verwendbaren Methoden für den Zugriff durch Steuerungen in Schienen

Auch habe ich eine Reihe von Utility-Methoden in meinen Controllern, die wahrscheinlich nicht in anderen Controllern oder in Zukunft überhaupt verwendet werden, aber ich fühle mich wie sie nur meinen Controller ein wenig aufblasen. Bewegen die Leute diese normalerweise irgendwo hin, um sauber zu bleiben, oder enden sie einfach mit einem riesigen Controller?

Ich komme aus Java und Actionscript, wo ich gerade neue util Klassen für dieses Zeug schaffen würde.

Antwort

12

Das lib ist ein Ort, den Sie Module setzen können/Klassen, die in oder von Controllern gemischt werden können (und alles andere, wirklich). Dies kann ein Ort sein, an dem Code eingefügt wird, der nicht in andere Bereiche fällt (aber sei vorsichtig damit, dass lib nicht selbst zu einem Chaos wird). Side Kommentare im Auge gerade zu halten:

  • Wenn Sie wissen, dass Sie eine große Menge verwandter Funktionalität aufweisen, könnte oder werden, in anderen Anwendungen verwendet werden, die ein Plugin sein könnten.

  • Sein auch wert wenn man bedenkt, dass es nichts falsch mit einem Modell zu schaffen, das nicht ein Active Record-Objekt ist. Je nachdem, was Sie haben, könnte das auch Sinn machen.

+0

Petes zwei weitere Punkte sind sehr gut. Ich bin der Meinung, dass 'lib' für die Logik der" generischen Bibliothek "und nicht für die Domänenlogik gedacht ist. Wenn Sie also eine Logik haben, die für diese Anwendung spezifisch ist, aber für mehrere Controller gilt, befindet sich der richtige Ort möglicherweise nur in einem separaten Modul im Verzeichnis "app/controllers". –

8

eine Moduldatei in lib Verzeichnis erstellen:

module ControllerUtil 
    def foo 
    end 

    def bar 
    end 
end 

das Modul in der Steuerung umfassen:

class UsersController < ApplicationController 
    include ControllerUtil 
end 
1

Controller sollte sehr gering sein - im Grunde Argumente und machen einige sehr hohe Einnahme Ebenenentscheidungen. Wenn Sie einige Hilfsfunktionen haben, die genau diese Dinge tun, aber nicht wiederverwendet werden, dann ist es richtig, sie im Controller zu behalten. Stellen Sie sicher, dass Sie sie als privat markieren.

Für häufiger geteilt Dinge, können Sie sie entweder in die Application zurück (wenn sie in allen Controllern gewöhnt sind) oder in eine Klasse in Ihrem app/models Verzeichnis. Ich empfehle das Verzeichnis models über lib, da Rails im Entwicklungsmodus viel besser darin ist, Änderungen an diesen Dateien zu erkennen und neu zu laden. Änderungen an Dateien in/lib erfordern in der Regel einen Neustart des Webservers, was den Entwicklungsaufwand verringert. Das ist bedauerlich, denn Controller-Helfer sollten eigentlich nicht mit Modellen gemischt werden.

Im Allgemeinen aber, wenn Sie mehr als eine Handvoll dieser Helfer haben, Sie tun, wahrscheinlich zu viel in Ihrem Controller. Schau sie dir genau an und sieh zu, ob sie vielleicht nicht Teil deiner Modelle sein sollten.

11

können Sie app/modules Verzeichnis erstellen, und XYZUtils Modul erstellen darin

beispiels
module XYZUtils 
    def abc 
    end 

    def efg 
    end 
end 

und schließen Sie das Modul wie und wann in Steuerungen oder Modelle usw. erforderlich

include XYZUtils 

Sie können verschiedene Module für Funktionen Dienstprogramm erstellen, um verschiedene Modelle oder Einrichtungen im Zusammenhang

Ich werde nicht /lib Verzeichnis bevorzugen, weil das den projektbezogene Code enthalten soll, nicht App im Zusammenhang, zB Aufgaben usw.

würde ich die ganze App bezogenen Code in /app Verzeichnis halten sich

+1

Wer diese Antwort mag, sollte auch die Antwort von @ edebill als weitere gute Gründe sehen, warum man solchen Code nicht in/lib einfügt – rmcsharry

1

Bezug zu Sahil kalra die oben Antwort von 2014:

Rails verfügt jetzt über ein app/controllers/concerns Verzeichnis, in dem Sie Module voller Hilfsmethoden einfügen und diese einfach in Ihre Controller integrieren oder erweitern können. Ich habe einfach alle meine logikintensiven Methoden aus meinem application_controller kopiert und eingefügt und sie funktionierten direkt nach dem Auspacken.

(Sie sollten natürlich, immer noch sicher, dass alles richtig funktioniert, bevor irgendetwas in der Produktionsumgebung.)

Verwandte Themen