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
Ich stimme Ihnen allen zu, dass dies das MVC-Muster brechen könnte, aber es gibt immer Gründe, ein Muster zu brechen. In meinem Fall benötigte ich diese Währungsformatierungsmethoden , um sie in einem Vorlagenfilter zu verwenden ( in meinem Fall Liquid ).
Am Ende fand ich heraus, dass ich auf diese Währungsformatierungsmethoden zugreifen konnte :
quelle
Ich weiß, dass dieser Thread sehr alt ist, aber jemand kann in Rails 4+ nach einer Lösung für dieses Problem suchen. Entwickler haben ActiveSupport :: NumberHelper hinzugefügt, das verwendet werden kann, ohne auf ansichtsbezogene Module / Klassen zuzugreifen.
quelle
number_to_percentage
in der Rails-Konsole experimentieren wollte . Vielen Dank!Sie müssen auch ActionView :: Helpers :: NumberHelper einschließen
quelle
details
den Helfer einsetzen.Huckepack aus der
@fguillen
Antwort wollte ich dienumber_to_currency
Methode in meinemApplicationHelper
Modul überschreiben, damit, wenn der Wert war0
oderblank
stattdessen ein Bindestrich ausgegeben wird.Hier ist mein Code für den Fall, dass ihr so etwas nützlich findet:
quelle
Sie können
view_context.number_to_currency
direkt von Ihrem Controller oder Modell verwenden.quelle
@ fguillens Weg ist gut, obwohl hier ein etwas saubererer Ansatz ist, insbesondere angesichts der Tatsache, dass die Frage zwei Verweise enthält
to_dollar
. Ich werde zuerst den Code von Ryan Bates demonstrieren ( http://railscasts.com/episodes/132-helpers-outside-views ).Beachten Sie den Anruf
helpers.pluralize
. Dies ist aufgrund der Methodendefinition (def helpers
) möglich, die einfach zurückgibtActionController::Base.helpers
. Daherhelpers.pluralize
ist kurz fürActionController::Base.helpers.pluralize
. Jetzt können Siehelpers.pluralize
mehrere Male verwenden, ohne die langen Modulpfade zu wiederholen.Ich nehme an, die Antwort auf diese spezielle Frage könnte sein:
quelle
Es ist keine gute Praxis, aber es funktioniert für mich!
Zum Importieren wird ActionView :: Helpers :: NumberHelper in den Controller aufgenommen. Beispielsweise:
Hoffe es hilft dir!
quelle
Wirklich überrascht, dass nicht eine Person über die Verwendung eines Dekorateurs gesprochen hat. Ihr Zweck ist es, das Problem zu lösen, mit dem Sie konfrontiert sind, und vieles mehr.
https://github.com/drapergem/draper
EDIT: Sieht so aus, als hätte die akzeptierte Antwort im Grunde genommen vorgeschlagen, so etwas zu tun. Aber ja, Sie möchten Dekorateure verwenden. Hier ist eine großartige Tutorial-Serie, die Ihnen hilft, mehr zu verstehen:
https://gorails.com/episodes/decorators-from-scratch?autoplay=1
PS - @ excid3 Ich akzeptiere kostenlose Mitgliedschaftsmonate LOL
quelle
Sie können nur
include ActiveSupport::NumberHelper
modulieren, wenn Sie keine zusätzlichen Funktionen benötigen, die durch definiert sindActionView
.https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383
quelle
Hilfsmethoden werden im Allgemeinen für View-Dateien verwendet. Es ist keine gute Praxis, diese Methoden in der Modellklasse zu verwenden. Aber wenn Sie verwenden möchten, ist Sams Antwort in Ordnung. ODER ich schlage vor, Sie können Ihre eigene benutzerdefinierte Methode schreiben.
quelle