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
Estoy de acuerdo con todos ustedes en que esto podría estar rompiendo el patrón MVC pero siempre hay razones para romper un patrón, en mi caso necesitaba estos métodos de formateador de moneda para usarlos en un filtro de plantilla ( Liquid en mi caso).
Al final, descubrí que podía acceder a estos métodos de formateador de moneda usando cosas como esta:
fuente
Sé que este hilo es muy antiguo, pero alguien puede buscar una solución para este problema en Rails 4+. Los desarrolladores agregaron ActiveSupport :: NumberHelper, que se puede usar sin acceder a los módulos / clases relacionados con la vista usando:
fuente
number_to_percentage
en la consola de Rails. ¡Gracias!También debe incluir ActionView :: Helpers :: NumberHelper
fuente
details
al ayudante.Aprovechando
@fguillen
la respuesta de ', quería anular elnumber_to_currency
método en miApplicationHelper
módulo para que si el valor fuera0
o, enblank
su lugar, mostrara un guión.Aquí está mi código en caso de que ustedes encuentren útil algo como esto:
fuente
Puede usarlo
view_context.number_to_currency
directamente desde su controlador o modelo.fuente
El método de @fguillen es bueno, aunque aquí hay un enfoque un poco más limpio, en particular dado que la pregunta hace dos referencias a
to_dollar
. Primero haré una demostración usando el código de Ryan Bates ( http://railscasts.com/episodios/132-helpers-outside-views ).Note la llamada
helpers.pluralize
. Esto es posible debido a la definición del método (def helpers
), que simplemente devuelveActionController::Base.helpers
. Por esohelpers.pluralize
es la abreviatura deActionController::Base.helpers.pluralize
. Ahora puede usarhelpers.pluralize
varias veces, sin repetir las rutas de módulo largas.Entonces supongo que la respuesta a esta pregunta en particular podría ser:
fuente
No es una buena práctica, ¡pero me funciona!
para importar incluya ActionView :: Helpers :: NumberHelper en el controlador. Por ejemplo:
¡Espero que te ayude!
fuente
Realmente sorprendido de que nadie haya hablado sobre el uso de un Decorador. Su propósito es resolver el problema al que se enfrenta y más.
https://github.com/drapergem/draper
EDITAR: Parece que la respuesta aceptada básicamente sugirió hacer algo como esto. Pero sí, quieres usar decoradores. Aquí hay una gran serie de tutoriales para ayudarlo a comprender más:
https://gorails.com/episodios/decorators-from-scratch?autoplay=1
PD - @ excid3 Acepto meses de membresía gratis LOL
fuente
Puede simplemente
include ActiveSupport::NumberHelper
modular, si no necesita características adicionales definidas porActionView
.https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383
fuente
Los métodos auxiliares se utilizan generalmente para archivos de visualización. No es una buena práctica utilizar estos métodos en la clase Model. Pero si quieres usar, la respuesta de Sam está bien. O le sugiero que pueda escribir su propio método personalizado.
fuente