No está disponible porque su uso en un modelo (normalmente) viola MVC (y parece que sí en su caso). Está tomando datos y manipulándolos para su presentación. Esto, por definición, pertenece a la vista, no al modelo.
Aquí hay algunas soluciones:
Utilice un objeto de modelo de vista o presentador para mediar entre el modelo y la vista. Esto casi definitivamente requiere más trabajo inicial que otras soluciones, pero casi siempre es un mejor diseño. El uso de ayudantes en un presentador / modelo de vista no viola MVC, ya que residen en la capa de vista, reemplazando a los ayudantes tradicionales de Rails personalizados y las vistas llenas de lógica.
Explícitamente include ActionView::Helpers::NumberHelper
en JobsHelper
lugar de depender de Rails para que lo haya cargado mágicamente por ti. Esto todavía no es genial, ya que no debería acceder a un ayudante desde un modelo.
Violar MVC y SRP . Vea la respuesta de fguillen para saber cómo hacer esto. No me repetiré aquí porque no estoy de acuerdo con él. Aún más, sin embargo, no estoy de acuerdo con contaminar su modelo con métodos de presentación como en la respuesta de Sam .
Si piensas "¡pero realmente necesito esto para escribir mis métodos to_csv
& to_pdf
en mi modelo!", Entonces toda tu premisa es incorrecta; después de todo, no tienes un to_html
método, ¿verdad? Y, sin embargo, su objeto se representa a menudo como HTML. Considere crear una nueva clase para generar su salida en lugar de hacer que su modelo de datos sepa qué es un CSV ( porque no debería ).
En cuanto al uso de ayudantes para errores de validación de ActiveModel en el modelo, bueno, lo siento, pero ActiveModel / Rails nos ha jodido a todos al obligar a que se realicen mensajes de error en la capa de datos, en lugar de devolver la idea semántica de un error. más tarde me di cuenta - suspiro . Puede evitar esto, pero básicamente significa que ya no usa ActiveModel :: Errores. Lo he hecho, funciona bien.
Como acotación al margen, aquí hay una forma útil de incluir ayudantes en un presentador / modelo de vista sin contaminar su conjunto de métodos (porque poder hacerlo, por ejemplo, MyPresenterOrViewModel.new.link_to(...)
no tiene sentido):
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