Es ist nicht verfügbar, da seine Verwendung in einem Modell (normalerweise) gegen MVC verstößt (und dies scheint in Ihrem Fall der Fall zu sein). Sie nehmen Daten und bearbeiten sie zur Präsentation. Dies gehört per Definition in die Ansicht, nicht in das Modell.
Hier sind einige Lösungen:
Verwenden Sie einen Präsentator oder ein Ansichtsmodellobjekt, um zwischen dem Modell und der Ansicht zu vermitteln. Dies erfordert fast definitiv mehr Anfangsarbeit als andere Lösungen, ist aber fast immer ein besseres Design. Die Verwendung von Helfern in einem Präsentator- / Ansichtsmodell verstößt nicht gegen MVC, da sie sich in der Ansichtsebene befinden und herkömmliche benutzerdefinierte Rails-Helfer und logikgefüllte Ansichten ersetzen.
Explizit include ActionView::Helpers::NumberHelper
in JobsHelper
anstatt abhängig von Rails, um es magisch für Sie geladen zu haben. Dies ist immer noch nicht großartig, da Sie nicht von einem Modell aus auf einen Helfer zugreifen sollten.
MVC & SRP verletzen . Siehe dazu die Antwort von fguillen . Ich werde es hier nicht wiederholen, weil ich damit nicht einverstanden bin. Umso mehr bin ich jedoch nicht damit einverstanden, Ihr Modell mit Präsentationsmethoden wie in Sams Antwort zu verschmutzen .
Wenn Sie denken "aber ich brauche das wirklich, um meine to_csv
& to_pdf
Methoden in mein Modell zu schreiben !", Dann ist Ihre gesamte Prämisse falsch - schließlich haben Sie keine to_html
Methode, oder? Und doch wird Ihr Objekt sehr oft als HTML gerendert. Erwägen Sie, eine neue Klasse zum Generieren Ihrer Ausgabe zu erstellen, anstatt Ihr Datenmodell wissen zu lassen, was eine CSV ist ( weil dies nicht der Fall sein sollte ).
Was die Verwendung von Hilfsprogrammen für ActiveModel-Validierungsfehler im Modell angeht, tut mir leid, aber ActiveModel / Rails hat uns alle dahin gebracht, indem er die Realisierung von Fehlermeldungen in der Datenschicht erzwungen hat, anstatt die semantische Idee eines Fehlers zurückzugeben später- realisiert Seufzer . Sie können dies umgehen, aber es bedeutet im Grunde, dass Sie ActiveModel :: Errors nicht mehr verwenden. Ich habe es geschafft, es funktioniert gut.
Abgesehen davon ist hier eine nützliche Möglichkeit, Helfer in ein Präsentations- / Ansichtsmodell aufzunehmen, ohne dessen Methoden zu verschmutzen (weil es z. B. MyPresenterOrViewModel.new.link_to(...)
keinen Sinn macht , dies zu tun ):
class MyPresenterOrViewModel
def some_field
helper.number_to_currency(amount, :precision => 0)
end
private
def helper
@helper ||= Class.new do
include ActionView::Helpers::NumberHelper
end.new
end
end