Você já usou a visibilidade protegida em Rails?
-
23-08-2019 - |
Pergunta
Confissão: eu só uso privada e público visibilidade para meus métodos
Eu tenho um sentimento que este é uma coisa ruim. Mas no Rails ele simplesmente não parece surgir como um problema.
Alguém tem um exemplo em Rails onde seria um grande erro não usar protegido visibilidade?
Solução
Atualizar - Por favor, veja o comentário abaixo que vincula a um verdadeira explicação para protected
/ private
em ruby ??. Isso era um preconceito profundamente arraigado que sobraram dos meus tempos de Java, na verdade. A única parte importante da esquerda para a minha resposta é que os métodos do controlador que não são ações não devem ser public
(ou pelo menos suas rotas deve protegê-los).
Herança de Tabela Única é um exemplo perfeito de quando protected
é útil no modelo de camadas, como é um dos usos mais comuns de herança lá.
No nível controlador, métodos auxiliares definidos no ApplicationController
deve ser marcado como protected
-. Se fossem private
os outros controladores não seria capaz de acessá-los, mas se eles são Rails public
vai tratá-los como ações
Pessoalmente, acho que a herança de classe I uso mais do que muitos dos meus amigos e colegas de trabalho, mesmo em aplicações Rails. Porque eu usá-lo muitas vezes (e saindo dos meus dias de Java), sou a favor protected
para todos os métodos auxiliares para dar liberdade a ninguém (normalmente eu) que quer estender a classe - a menos que eu estou realmente envergonhado com um, então eu marcá-lo private
. :)
Outras dicas
Eu tenho SingleTableInheritance
class Person E eu usar os métodos protegidos para implementar um método particular que é comum para Estudantes e Professores: Disclaimer: Existem plugins como ato-as-paranóico e outros para implementar o recurso que eu uso aqui para mostrar-lhe o caso, mas eu tenho uma paisagem mais complexa, que eu simplificado aqui para chegar ao seu ponto 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