Він недоступний, оскільки його використання в моделі (як правило) порушує MVC (і, здається, у вашому випадку). Ви берете дані та маніпулюєте ними для презентації. Це, за визначенням, належить на думку, а не моделі.
Ось кілька рішень:
Використовуйте презентатор або об’єкт перегляду моделі для посередництва між моделлю та видом. Це майже напевно вимагає більше початкової роботи, ніж інші рішення, але майже завжди є кращим дизайном. Використання помічників у презентаторі / моделі перегляду не порушує MVC, оскільки вони перебувають у шарі перегляду, замінюючи традиційні власні помічники Rails та заповнені логікою подання.
Явно include ActionView::Helpers::NumberHelperв JobsHelperзамість того, щоб залежати від Rails, щоб магічно завантажив його для вас. Це все ще не чудово, оскільки вам не слід отримувати доступ до помічника від моделі.
Порушити MVC та SRP . Дивіться відповідь fguillen, як це зробити. Я не буду повторювати це тут, бо я з цим не згоден. Навіть більше того, я не погоджуюсь із забрудненням вашої моделі методами презентації, як у відповіді Сема .
Якщо ви думаєте "але мені це дійсно потрібно, щоб написати мої to_csv& to_pdfметоди в моїй моделі!", То вся ваша передумова помилкова - зрештою, у вас немає to_htmlметоду, правда? І все ж ваш об'єкт дуже часто відображається як HTML. Подумайте про створення нового класу для генерування результатів, а не про те, щоб ваша модель даних знала, що таке CSV ( оскільки вона не повинна ).
Що стосується використання помічників для помилок валідації ActiveModel в моделі, ну, вибачте, але ActiveModel / Rails нас усіх зіпсувало, змусивши реалізувати повідомлення про помилки на рівні даних, а не повертаючи семантичну ідею помилки. усвідомив пізніше— зітхання . Ви можете обійти це, але це в основному означає більше не використовувати ActiveModel :: Помилки. Я це зробив, це працює добре.
Окрім того, ось корисний спосіб включити помічників у презентатор / модель перегляду без забруднення її набору методів (оскільки можливість робити, наприклад, MyPresenterOrViewModel.new.link_to(...)не має сенсу):
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