Видимость методов в Ruby (общедоступные, защищенные и частные методы) хорошо объяснена в таких местах, как это сообщение в блоге . Но в Ruby on Rails это выглядит немного иначе, чем в обычном приложении Ruby, из-за способа настройки фреймворка. Итак, в моделях, контроллерах, помощниках, тестах и т.д. Rails, когда уместно / не уместно использовать защищенные или частные методы?
Изменить : Спасибо за ответы. Я понимаю концепцию защищенного и частного в Ruby, но я ищу больше объяснений типичного способа использования этих типов видимости в контексте различных частей приложения Rails (модели, контроллеры, помощники, тесты) . Например, методы общедоступного контроллера - это методы действий, защищенные методы в контроллере приложения используются для «вспомогательных методов», к которым требуется доступ для нескольких контроллеров, и т. Д.
источник
Вы используете частный метод, если не хотите никого другого, кроме
self
как использовать метод. Вы используете защищенный метод, если хотите, чтобыself and is_a?(self)
вызовы могли вызывать только s.Хорошее использование protected может быть, если у вас есть «виртуальный» метод инициализации.
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 будет иметь разные значения. а в производных экземплярах не будет @baz
Обновление: с тех пор, как я написал это, некоторые вещи изменились в Ruby 2.0+. У Аарона Паттерсона есть отличная запись http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html
источник
self and is_a?(self)
. Я всегда объяснял, что защищенные методы доступны в дочерних классах.http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility
источник
Кажется, вы хорошо представляете семантику видимости класса (общедоступный / защищенный / частный) применительно к методам. Все, что я могу предложить, - это краткое описание того, как я реализую это в своих приложениях Rails.
Я реализую защищенные методы в базовом контроллере приложения, чтобы они могли вызываться любым контроллером через фильтры (например, before_filter: method_foo). Аналогичным образом я определяю защищенные методы для моделей, которые я хочу использовать во всех из них в базовой модели, от которой все они наследуются.
источник
Хотя действия должны быть общедоступными методами контроллера, не все общедоступные методы обязательно являются действиями. Вы можете использовать,
hide_action
если вы используете маршрут для приема всей почты домена, например,/:controller/:action/:id
или если он отключен (по умолчанию в Rails 3), тогда будут вызываться только методы с явными маршрутами.Это может быть полезно, если вы передаете экземпляр контроллера в какую-либо другую библиотеку, например движок шаблонов Liquid, поскольку вы можете предоставить общедоступный интерфейс, а не использовать send в своих фильтрах и тегах Liquid.
источник