Não está disponível porque seu uso em um modelo (normalmente) viola o MVC (e parece que sim no seu caso). Você está pegando dados e manipulando-os para apresentação. Isso, por definição, pertence à visão, não ao modelo.
Aqui estão algumas soluções:
Use um apresentador ou objeto de modelo de exibição para mediar entre o modelo e a exibição. Isso quase definitivamente requer mais trabalho inicial do que outras soluções, mas quase sempre é um design melhor. O uso de helpers em um apresentador / modelo de visualização não viola o MVC, pois eles residem na camada de visualização, substituindo auxiliares Rails personalizados tradicionais e visualizações preenchidas com lógica.
Explicitamente include ActionView::Helpers::NumberHelper
em JobsHelper
vez de depender do Rails para carregá-lo magicamente para você. Isso ainda não é ótimo, pois você não deve acessar um auxiliar de um modelo.
Violar MVC e SRP . Veja a resposta de fguillen para saber como fazer isso. Não vou repetir aqui porque não concordo com isso. Ainda mais, eu discordo em poluir seu modelo com métodos de apresentação como na resposta de Sam .
Se você pensa “mas eu realmente preciso disso para escrever meus to_csv
& to_pdf
métodos em meu modelo!”, Então toda a sua premissa está errada - afinal, você não tem um to_html
método, não é? E ainda assim, seu objeto é frequentemente renderizado como HTML. Considere a criação de uma nova classe para gerar sua saída em vez de fazer seu modelo de dados saber o que é um CSV ( porque não deveria ).
Quanto ao uso de auxiliares para erros de validação de ActiveModel no modelo, bem, sinto muito, mas ActiveModel / Rails nos ferrou, forçando mensagens de erro a serem realizadas na camada de dados, em vez de retornar a ideia semântica de um erro a ser percebi mais tarde - suspiro . Você pode contornar isso, mas basicamente significa não usar mais ActiveModel :: Errors. Eu fiz isso, funciona bem.
Como um aparte, aqui está uma maneira útil de incluir auxiliares em um modelo de apresentador / visualização sem poluir seu conjunto de métodos (porque ser capaz de fazer, por exemplo, MyPresenterOrViewModel.new.link_to(...)
não faz 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