Да. Согласно строгим учениям MVC, это дурной тон и принадлежит помощнику.
Теоретически: этот конкретный кусок функциональности специфичен для представления, поэтому, согласно учениям MVC, он принадлежит помощнику вида.
На практике: это действительно не имеет значения. Я считаю, что ActionText анализируется при загрузке сервера / консоли. Это означает, что файл не нужно загружать снова. Также, вероятно, лучше вызывать метод напрямую вместо включения ActionText со стороны управления памятью.
Ни одно тело не помешает вам добавить этот код в Модель или не заставит вас что-то делать Правильный путь
Лично я предпочитаю определять такие виды методов в модели только потому, что нахожу синтаксис метода экземпляра (model.last_updated
) более эстетически привлекательным, чем у помощника (last_updated(model)
). Однако динамическая природа рубина позволяет вам использовать его в обоих направлениях. По сути, определите методы экземпляра в вашей модели, которые доступны только в представлениях. Все, что ему нужно, это дополнительный шаг.
Если вы действительно заинтересованы в этом дополнительном шаге, он будет выглядеть следующим образом:
module ModelHelper
def included(base)
Model.send(:include, ModelInstanceMethods)
end
module ModelInstanceMethods
def last_updated
updated_at? ? "Updated #{ActionText::time_ago_in_words(updated_at)} ago" : "never updated"
end
end
end
Где Model - имя класса модели, частью которой должен быть этот метод.