Он недоступен, потому что его использование в модели (обычно) нарушает MVC (и, похоже, в вашем случае). Вы берете данные и манипулируете ими для презентации. Это, по определению, принадлежит взгляду, а не модели.
Вот несколько решений:
Используйте объект модели презентатора или представления в качестве посредника между моделью и представлением. Это почти наверняка требует больше первоначальной работы, чем другие решения, но почти всегда лучше. Использование помощников в модели презентатора / представления не нарушает MVC, так как они находятся на уровне представления, заменяя традиционные пользовательские помощники Rails и представления с логикой.
Явно include ActionView::Helpers::NumberHelperin JobsHelperвместо того, чтобы зависеть от Rails, который волшебным образом загрузил его за вас. Это все еще не очень хорошо, так как вам не нужно обращаться к помощнику из модели.
Нарушают MVC и SRP . См . Ответ fguillen, чтобы узнать, как это сделать. Я не буду повторять это здесь, потому что я не согласен с этим. Тем не менее, я не согласен с загрязнением вашей модели методами представления, как в ответе Сэма .
Если вы думаете: «Но мне это действительно нужно, чтобы написать свои to_csv& to_pdfметоды в моей модели!», То вся ваша предпосылка неверна - в конце концов, у вас нет to_htmlметода, не так ли? И все же ваш объект очень часто отображается как HTML. Рассмотрите возможность создания нового класса для генерации вашего вывода вместо того, чтобы ваша модель данных знала, что такое CSV ( потому что он не должен ).
Что касается использования помощников для ошибок валидации ActiveModel в модели, что ж, извините, но ActiveModel / Rails нас всех обманули, заставив сообщения об ошибках реализовываться на уровне данных, вместо того, чтобы возвращать семантическую идею ошибки, которая должна быть понял позже - вздох . Вы можете обойти это, но в основном это означает, что ActiveModel :: Errors больше не используется. Я сделал это, работает хорошо.
В стороне, вот полезный способ включить помощников в модель презентатора / представления, не загрязняя ее набор методов (потому что способность делать, например, 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