Widoczność metod w Rubim (metody publiczne, chronione i prywatne) została dobrze wyjaśniona w miejscach takich jak ten post na blogu . Jednak w Ruby on Rails wygląda to nieco inaczej niż w zwykłej aplikacji Ruby ze względu na sposób skonfigurowania frameworka. Zatem w modelach Railsowych, kontrolerach, pomocnikach, testach itp., Kiedy jest / nie jest właściwe stosowanie metod chronionych lub prywatnych?
Edycja : Dzięki za dotychczasowe odpowiedzi. Rozumiem pojęcie chronionego i prywatnego w Rubim, ale szukam bardziej wyjaśnienia typowego sposobu, w jaki te typy widoczności są używane w kontekście różnych elementów aplikacji Railsowej (modele, kontrolery, pomocniki, testy) . Na przykład metody kontrolera publicznego są metodami akcji, metody chronione w kontrolerze aplikacji są używane jako „metody pomocnicze”, do których dostęp musi mieć wiele kontrolerów itp.
źródło
Używasz metody prywatnej, jeśli nie chcesz nikogo innego, jak tylko
self
użyć metody. Używasz metody chronionej, jeśli chcesz, aby cośself and is_a?(self)
mogło wywołać tylko s.Dobrym zastosowaniem chronionego może być „wirtualna” metoda inicjalizacji.
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 będzie miało różne wartości. a instancje pochodne nie będą miały @baz
Aktualizacja: Odkąd to napisałem, niektóre rzeczy uległy zmianie w Ruby 2.0+ Aaron Patterson świetnie napisał http://tenderlovemaking.com/2012/09/07/protected-methods-and-ruby-2-0.html
źródło
self and is_a?(self)
. Zawsze wyjaśniałem metody chronione jako dostępne w klasach dla dzieci.http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Declaring_Visibility
źródło
Wygląda na to, że dobrze rozumiesz semantykę widoczności klas (publiczna / chroniona / prywatna) w zastosowaniu do metod. Wszystko, co mogę zaoferować, to szybki zarys sposobu, w jaki wdrażam go w moich aplikacjach Railsowych.
Implementuję metody chronione w podstawowym kontrolerze aplikacji, dzięki czemu mogą być wywoływane przez dowolny kontroler poprzez filtry (np. Before_filter: method_foo). W podobny sposób definiuję chronione metody dla modeli, których chcę używać we wszystkich w modelu podstawowym, z którego wszystkie dziedziczą.
źródło
Chociaż akcje muszą być publicznymi metodami kontrolera, nie wszystkie metody publiczne muszą być akcjami. Możesz użyć,
hide_action
jeśli używasz trasy typu catch-all, takiej jak/:controller/:action/:id
lub jeśli jest wyłączona (domyślnie w Railsach 3), wtedy wywołane zostaną tylko metody z jawnymi trasami.Może to być przydatne, jeśli przekazujesz instancję kontrolera do innej biblioteki, takiej jak silnik szablonów Liquid, ponieważ możesz zapewnić publiczny interfejs, zamiast używać wysyłania w swoich filtrach i tagach Liquid.
źródło