Non è disponibile perché il suo utilizzo in un modello (in genere) viola MVC (e sembra che lo sia nel tuo caso). Stai prendendo dati e li manipoli per la presentazione. Questo, per definizione, appartiene alla vista, non al modello.
Ecco alcune soluzioni:
Utilizzare un presentatore o un oggetto modello di visualizzazione per mediare tra il modello e la vista. Questo richiede quasi sicuramente più lavoro iniziale rispetto ad altre soluzioni, ma è quasi sempre un design migliore. L'uso di helper in un presenter / view-model non viola MVC, poiché risiedono nel livello di visualizzazione, sostituendo i tradizionali helper Rails personalizzati e le visualizzazioni piene di logica.
Esplicitamente include ActionView::Helpers::NumberHelperin JobsHelperinvece di dipendere da Rails essersi magicamente caricati per voi. Questo non è ancora eccezionale, poiché non dovresti accedere a un aiutante da un modello.
Violare MVC e SRP . Vedi la risposta di fguillen per sapere come farlo. Non lo farò eco qui perché non sono d'accordo con esso. Ancora di più, però, non sono d'accordo con l'inquinamento del tuo modello con metodi di presentazione come nella risposta di Sam .
Se pensi "ma ho davvero bisogno di questo per scrivere i miei metodi to_csv& to_pdfnel mio modello!", Allora tutta la tua premessa è sbagliata - dopo tutto, non hai un to_htmlmetodo, vero? Eppure il tuo oggetto è molto spesso reso come HTML. Prendi in considerazione la creazione di una nuova classe per generare l'output invece di far sapere al tuo modello di dati cos'è un CSV ( perché non dovrebbe ).
Per quanto riguarda l'utilizzo di helper per gli errori di convalida di ActiveModel nel modello, beh, mi dispiace ma ActiveModel / Rails ci ha fregati tutti costringendo i messaggi di errore a essere realizzati nel livello dati, piuttosto che restituire l' idea semantica di un errore da essere realizzato più tardi - sigh . Puoi aggirare questo problema, ma fondamentalmente significa non usare più ActiveModel :: Errors. L'ho fatto, funziona bene.
Per inciso, ecco un modo utile per includere gli helper in un presentatore / modello di visualizzazione senza inquinare il suo insieme di metodi (perché essere in grado di fare ad esempio MyPresenterOrViewModel.new.link_to(...)non ha senso):
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