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