Oki.Давайте подведем итоги.Вам нужен доступ к определенным функциям / методам, но вы не хотите, чтобы эти методы были присоединены к текущему объекту.
Итак, вы хотите создать прокси-объект, который будет прокси / делегировать этим методам.
class Helper
class << self
#include Singleton - no need to do this, class objects are singletons
include ApplicationHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::UrlHelper
include ApplicationHelper
end
end
И в контроллере:
class UserController < ApplicationController
def your_method
Helper.link_to_profile
end
end
Основной недостатокэтот подход заключается в том, что из вспомогательных функций у вас не будет доступа к контексту контроллера (например, у вас не будет доступа к параметрам, сеансам и т. д.)
Компромиссом будет объявление этих функций частными ввспомогательный модуль, поэтому, когда вы включите модуль, они также будут частными в классе контроллера.
module ApplicationHelper
private
def link_to_profile
end
end
class UserController < ApplicationController
include ApplicationHelper
end
, как указано Damien .
Обновление : причина, по которой вы получаете ошибку 'url_for', заключается в том, что у вас нет доступа к контексту контроллера, как указано выше.Вы можете принудительно передать контроллер в качестве параметра (в стиле Java;)), например:
Helper.link_to_profile(user, :controller => self)
, а затем, в вашем помощнике:
def link_to_profile(user, options)
options[:controller].url_for(...)
end
или событие большего взлома, представленное здесь .Однако я бы порекомендовал это решение, сделав методы приватными и включив их в контроллер.