Usate mai protetto visibilità in Rails?
-
23-08-2019 - |
Domanda
Confessione:Io uso solo privato e pubblico visibilità per i miei metodi!
Ho la sensazione che questa è una brutta cosa.Ma in Rails non pare proprio a venire come un problema.
Qualcuno ha un esempio in Rails, dove sarebbe un grosso errore a non utilizzare protetta la visibilità?
Soluzione
Aggiornamento -- Si prega di vedere il commento qui sotto che si collega a un la vera spiegazione di protected
/private
in Ruby.Che era un profondo pregiudizio di sinistra dai miei Java giorni, anzi.L'unica parte importante sinistro per la mia risposta è che i metodi del controller che non sono azioni non dovrebbe essere public
(o almeno rotte dovrebbe proteggere).
Singola Tabella Eredità, è un perfetto esempio di quando protected
è utile nel modello di livello, in quanto è uno degli usi più comuni di ereditarietà c'.
Nel controller di livello, metodi di supporto definiti sulla ApplicationController
dovrebbe essere contrassegnato come protected
-- se fossero private
gli altri controller di non essere in grado di accedervi, ma se sono public
Guide li trattano come azioni.
Personalmente, trovo che utilizzare l'ereditarietà di classe di più di molti miei amici e colleghi, anche nelle applicazioni Rails.Perché lo uso spesso (e venuta fuori la mia versione di Java giorni), io sono a favore protected
per tutti i metodi di supporto per dare la libertà a chiunque (di solito io) che vuole estendere la classe -- a meno che io sono davvero imbarazzato, poi ho segnare private
. :)
Altri suggerimenti
Ho SingleTableInheritance
classe Persona <AR::base Insegnante di classe <Persona classe Studente < Persona
E io uso i metodi protetti per implementare un metodo privato che è comune per Studenti e docenti:
class Person < AR::base
def self.find(*args)
reject_leaves(super(*args))
end
protected
def self.reject_leaves(target) #like a private in Teacher and Student
case target
when Array target.select{|t| reject_leaves(t)}
when Person (target.leave_date < Date.today ? target : nil)
else target
end
end
end
Disclaimer:Ci sono dei plugin come agire-come-paranoico e altri per implementare la funzione che uso qui per mostrarvi il caso, ma ho un più complesso del paesaggio, che ho semplificato qui per ottenere il vostro punto.