2012-03-21 3 views
3

У меня есть много контроллеров, которые будут иметь подобное поведение, например. пользователь должен войти в систему, необходимо настроить некоторую область видимости, необходимо установить current_account/current_user и кэшировать разрешения.Подклассифицирующие контультеры, а когда звонить супер

Я думаю об использовании стандартного контроллера и подклассификации.

class MyStandardController < ApplicationController 
before_filter :xyz 
end 

class SomeController < MyStandardController 
end 

Что мне интересно, это мне нужно/когда позвонить super вообще?

благодарит

+0

Я также хотел бы отметить большинство действий, которые вы ссылаетесь на аутентификацию окружающего пользователя (они они?) И авторизация (имеют ли они доступ к определенному ресурсу?), Которые лучше всего обрабатываются такими драгоценными камнями, как authlogic или разрабатываются с помощью cancan. –

+0

Я использую программу, я могу использовать cancan. –

ответ

5

Вам не нужно когда-нибудь позвонить super внутри контроллера, который наследуется от другого контроллера; на самом деле, это было бы, наверное, странно. Super выполняет метод с таким же именем из суперкласса, и у вас, вероятно, не будет никаких методов на MyStandardController, вы переопределите его дочерние элементы.

Основная причина для этого - как вы сказали сами, получить фильтры и методы, упрощенные именами между контроллерами. Мы делаем что-то подобное в наших приложениях, где одна область сайта с очень похожим поведением наследуется от контроллера (например, ShoppingController), который имеет раздел частных методов удобства, которые можно использовать только для всех своих детей.

Однако, по-видимому, было бы лучше иметь модули, которые реализуют нужные функции, и включать их в нужные контроллеры. В конце концов вы, вероятно, захотите что-то с одного контроллера на другом, и сделать это проще с помощью модулей, чем со сложными иерархиями наследования.

+0

Полностью согласен с Veraticus. Простым решением было бы поставить 'before_filter' в' application_controller.rb' - это типично для таких случаев, как проверка подлинности. Если существует действительно пространство имен (подмножество действий приложения, для которого это применимо, например, «Admin»), то не страшная идея создать модуль, содержащий модели (и представления и контроллер), такие как «Admin :: UserManager» - before_filter может быть просто определен в 'admin_controller.rb' (я думаю) –

+1

Спасибо, еще один вопрос, если я определяю метод, например. mydef в MyStandardController, как я могу сделать его доступным в моих представлениях? Если я использую helper_method для указания помощника в MyStandardController, он, похоже, не доступен в представлении, используемом контультерами для этого подкласса. –

+0

Вы, вероятно, не должны этого делать. Вместо этого используйте вспомогательный метод или вызовите метод в действии вашего контроллера и сделайте результаты доступными для вашего представления через переменную экземпляра. – Veraticus

Смежные вопросы