Он недоступен, потому что его использование в модели (как правило) нарушает MVC (и, похоже, в вашем случае).Вы берете данные и манипулируете ими для представления.Это, по определению, относится к представлению, а не к модели.
Вот некоторые решения:
Используйте объект презентатора или представления модели для посредничества между моделью иПосмотреть.Это почти наверняка требует больше начальной работы, чем другие решения, но почти всегда лучший дизайн.Использование помощников в презентере / модели представления не нарушает MVC, поскольку они находятся в слое представления, заменяя традиционные пользовательские помощники Rails и логические представления.
Явно include ActionView::Helpers::NumberHelper
в 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