Подтвердить что ты не робот

Защищенные и частные методы в Rails

Наглядность методов в Ruby (общедоступные, защищенные и частные методы) была хорошо объяснена в таких местах, как этот пост в блоге. Но в Ruby on Rails это выглядит немного иначе, чем в обычном Ruby-приложении из-за того, как настроена структура. Итак, в моделях Rails, контроллерах, помощниках, тестах и ​​т.д., Когда/не подходит ли использовать защищенные или частные методы?

Изменить. Спасибо за ответы. Я понимаю концепцию защищенного и частного в Ruby, но я больше ищу об объяснении типичного способа использования этих типов видимости в контексте различных частей приложения Rails (модели, контроллеры, помощники, тесты), Например, методы открытого контроллера - это методы действия, защищенные методы в контроллере приложения используются для "вспомогательных методов", к которым необходимо обращаться несколькими контроллерами и т.д.

4b9b3361

Ответ 1

Для моделей идея состоит в том, что общедоступные методы - это открытый интерфейс класса. Публичные методы предназначены для использования другими объектами, тогда как защищенные/частные методы должны быть скрыты снаружи.

Это та же практика, что и в других объектно-ориентированных языках.

Для контроллеров и, просто делайте, как вам будет угодно. Оба тестовых класса контроллера и только создаются и вызывается каркасом ( yes, я знаю, что теоретически вы можете получить контроллер из представления, но если вы это сделаете, что-то странно в любом случаезабастовкa > ). Поскольку никто никогда не будет создавать эти вещи напрямую, там нечего "защищать".

Добавление/Исправление: Для контроллеров вы должны пометить методы "помощника" как protected private, и только сами действия должны быть общедоступными. Структура никогда не будет маршрутизировать любые входящие HTTP-вызовы на действия/методы, которые не являются общедоступными, поэтому ваши вспомогательные методы должны быть защищены таким образом.

Для помощников не будет никакого смысла, если метод защищен или закрыт, поскольку они всегда называются "напрямую".

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

Ответ 2

Вы используете закрытый метод, если хотите, чтобы никто не использовал self, чтобы использовать метод. Вы используете защищенный метод, если хотите что-то, что может вызвать только self and is_a?(self).

Хорошее использование защищенного может быть, если у вас есть "виртуальный" метод инициализации.

class Base
    def initialize()
        set_defaults()
        #other stuff
    end

    protected
    def set_defaults()
        # defaults for this type
        @foo = 7
        calculate_and_set_baz()
    end

    private
    def calculate_and_set_baz()
        @baz = "Something that only base classes have like a file handle or resource"
    end
end

class Derived < Base
    protected
    def set_defaults()
        @foo = 13
    end
end

@foo будет иметь разные значения. и в Derived экземплярах не будет @baz

Обновление: Поскольку я написал это, некоторые вещи изменились в Ruby 2.0+. Аарон Паттерсон отлично написал http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html

Ответ 3

Разница между защищенными и частный тонкий. Если метод он может быть вызван любым экземпляр определяющего класса или его подклассы. Если метод является приватным, могут быть вызваны только в контексте вызывающего объекта --- это никогда доступ к другому объекту частные частные методы напрямую, даже если объект одного и того же класса в качестве вызывающего. Для защищенных методов, они доступны из объекты того же класса (или дети).

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility

Ответ 4

Вы, похоже, хорошо разбираетесь в семантике видимости класса (public/protected/private) применительно к методам. Все, что я могу предложить, - это краткое описание того, как я реализую его в своих приложениях Rails.

Я реализую защищенные методы в базовом контроллере приложения, чтобы их можно было вызвать любым контроллером через фильтры (например, before_filter: method_foo). Аналогичным образом я определяю защищенные методы для моделей, которые я хочу использовать во всех них в базовой модели, из которой они все наследуют.

Ответ 5

Хотя действия должны быть общедоступными методами контроллера, не все общедоступные методы обязательно являются действиями. Вы можете использовать hide_action, если вы используете общий маршрут, подобный /:controller/:action/:id, или если он отключен (по умолчанию в Rails 3) то будут вызваны только методы с явными маршрутами.

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