Il n'est pas disponible car son utilisation dans un modèle enfreint (généralement) MVC (et cela semble le cas dans votre cas). Vous prenez des données et vous les manipulez pour les présenter. Ceci, par définition, appartient à la vue, pas au modèle.
Voici quelques solutions:
Utilisez un objet de présentation ou de modèle de vue pour assurer la médiation entre le modèle et la vue. Cela nécessite presque certainement plus de travail initial que les autres solutions, mais c'est presque toujours une meilleure conception. L'utilisation des helpers dans un présentateur / modèle de vue ne viole pas MVC, car ils résident dans la couche de vue, remplaçant les assistants Rails personnalisés traditionnels et les vues à remplissage logique.
Explicitement include ActionView::Helpers::NumberHelper
au JobsHelper
lieu de dépendre de Rails pour l'avoir chargé comme par magie pour vous. Ce n'est toujours pas génial, car vous ne devriez pas accéder à un assistant d'un modèle.
Violer MVC et SRP . Voir la réponse de fguillen pour savoir comment procéder. Je ne vais pas en faire écho ici parce que je ne suis pas d'accord avec cela. Plus encore, cependant, je ne suis pas d'accord avec la pollution de votre modèle avec des méthodes de présentation comme dans la réponse de Sam .
Si vous pensez «mais j'en ai vraiment besoin pour écrire mes to_csv
& to_pdf
méthodes dans mon modèle!», Alors votre prémisse entière est fausse - après tout, vous n'avez pas de to_html
méthode, n'est-ce pas ? Et pourtant, votre objet est très souvent rendu au format HTML. Envisagez de créer une nouvelle classe pour générer votre sortie au lieu de faire savoir à votre modèle de données ce qu'est un CSV ( car il ne devrait pas ).
En ce qui concerne l'utilisation des aides pour les erreurs de validation ActiveModel dans le modèle, eh bien, je suis désolé mais ActiveModel / Rails nous a tous vissés en forçant les messages d'erreur à se réaliser dans la couche de données, plutôt que de renvoyer l' idée sémantique d'une erreur. réalisé plus tard - soupir . Vous pouvez contourner cela, mais cela signifie essentiellement ne plus utiliser ActiveModel :: Errors. Je l'ai fait, ça marche bien.
En passant, voici un moyen utile d'inclure des helpers dans un présentateur / modèle de vue sans polluer son ensemble de méthodes (car pouvoir faire par exemple MyPresenterOrViewModel.new.link_to(...)
n'a aucun sens):
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
Je suis d'accord avec vous tous sur le fait que cela pourrait briser le modèle MVC, mais il y a toujours des raisons de casser un modèle, dans mon cas, j'avais besoin de ces méthodes de formateur de devises pour les utiliser dans un filtre de modèle ( Liquid dans mon cas).
À la fin, j'ai découvert que je pouvais accéder à ces méthodes de formateur de devises en utilisant des choses comme ceci:
la source
Je sais que ce fil est très ancien, mais quelqu'un peut chercher une solution à ce problème dans Rails 4+. Les développeurs ont ajouté ActiveSupport :: NumberHelper, qui peut être utilisé sans accéder aux modules / classes liés à la vue en utilisant:
la source
number_to_percentage
dans la console Rails. Merci!Vous devez également inclure le ActionView :: Helpers :: NumberHelper
la source
details
l'aide.En utilisant
@fguillen
la réponse de 's, je voulais remplacer lanumber_to_currency
méthode dans monApplicationHelper
module de sorte que si la valeur était0
oublank
qu'elle produise un tiret à la place.Voici mon code au cas où vous trouveriez quelque chose comme ça utile:
la source
Vous pouvez utiliser
view_context.number_to_currency
directement à partir de votre contrôleur ou modèle.la source
La méthode de @ fguillen est bonne, bien que voici une approche légèrement plus claire, d'autant plus que la question fait deux références
to_dollar
. Je vais d'abord démontrer en utilisant le code de Ryan Bates ( http://railscasts.com/episodes/132-helpers-outside-views ).Remarquez l'appel
helpers.pluralize
. Cela est possible grâce à la méthode definition (def helpers
), qui renvoie simplementActionController::Base.helpers
. Par conséquent,helpers.pluralize
c'est l'abréviation deActionController::Base.helpers.pluralize
. Maintenant vous pouvez utiliserhelpers.pluralize
plusieurs fois, sans répéter les longs chemins de module.Je suppose donc que la réponse à cette question particulière pourrait être:
la source
Ce n'est pas une bonne pratique mais ça marche pour moi!
pour importer, incluez ActionView :: Helpers :: NumberHelper dans le contrôleur. Par exemple:
J'espère que cela vous aide!
la source
Vraiment surpris, personne n'a parlé de l'utilisation d'un décorateur. Leur objectif est de résoudre le problème auquel vous êtes confronté, et plus encore.
https://github.com/drapergem/draper
EDIT: On dirait que la réponse acceptée a essentiellement suggéré de faire quelque chose comme ça. Mais oui, vous voulez utiliser des décorateurs. Voici une excellente série de tutoriels pour vous aider à mieux comprendre:
https://gorails.com/episodes/decorators-from-scratch?autoplay=1
PS - @ excid3 J'accepte les mois d'abonnement gratuits LOL
la source
Vous pouvez simplement
include ActiveSupport::NumberHelper
module, si vous n'avez pas besoin de fonctionnalités supplémentaires définies parActionView
.https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383
la source
Les méthodes d'assistance sont généralement utilisées pour les fichiers View. Il n'est pas recommandé d'utiliser ces méthodes dans la classe Model. Mais si vous voulez utiliser, la réponse de Sam est correcte. OU je suggère que vous puissiez écrire votre propre méthode personnalisée.
la source