Nie jest dostępny, ponieważ jego użycie w modelu (zazwyczaj) narusza MVC (i wydaje się, że tak jest w Twoim przypadku). Pobierasz dane i manipulujesz nimi w celu prezentacji. To z definicji należy do widoku, a nie do modelu.
Oto kilka rozwiązań:
Użyj prezentera lub obiektu widoku modelu, aby pośredniczyć między modelem a widokiem. To prawie na pewno wymaga więcej wstępnej pracy niż inne rozwiązania, ale prawie zawsze jest lepszym projektem. Używanie pomocników w modelu prezentera / widoku nie narusza MVC, ponieważ znajdują się one w warstwie widoku, zastępując tradycyjne niestandardowe pomocniki Rails i widoki wypełnione logiką.
Jawnie include ActionView::Helpers::NumberHelperw JobsHelperzamiast polegać na Railsach, które magicznie go załadowały. To nadal nie jest świetne, ponieważ nie powinieneś mieć dostępu do pomocnika z modelu.
Naruszaj MVC i SRP . Zobacz odpowiedź fguillen, jak to zrobić. Nie powtórzę tego tutaj, ponieważ się z tym nie zgadzam. Tym bardziej jednak nie zgadzam się z zanieczyszczeniem twojego modelu metodami prezentacji, jak w odpowiedzi Sama .
Jeśli myślisz „ale naprawdę potrzebuję tego, aby zapisać moje to_csv& to_pdfmetody w moim modelu!”, To całe twoje założenie jest błędne - w końcu nie masz to_htmlmetody, prawda? A jednak twój obiekt jest bardzo często renderowany jako HTML. Rozważ utworzenie nowej klasy do generowania wyników, zamiast informowania modelu danych, czym jest plik CSV ( ponieważ nie powinien ).
Jeśli chodzi o używanie pomocników do błędów walidacji ActiveModel w modelu, cóż, przykro mi, ale ActiveModel / Rails nas w to wkręciły, zmuszając komunikaty o błędach do realizacji w warstwie danych, zamiast zwracać semantyczną ideę błędu do uświadomiłem sobie później - westchnij . Możesz to obejść, ale w zasadzie oznacza to, że nie używasz już ActiveModel :: Errors. Zrobiłem to, działa dobrze.
Na marginesie, oto przydatny sposób na włączenie pomocników do modelu prezentera / widoku bez zanieczyszczania jego zestawu metod (ponieważ możliwość robienia np. Nie MyPresenterOrViewModel.new.link_to(...)ma sensu):
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