자백 : 나는 단지 비공개과 공개 나의 방법에 대한 가시성을 사용합니다!Rails에서 보호 된 가시성을 사용하고 있습니까?
나는 이것이 나쁜 것 같다. 그러나 Rails에서는 문제가되지 않는 것 같습니다.
레일스에서 사용하지 않는 큰 실수가있는 사람이 누구입니까 가시성을 보호합니까?
자백 : 나는 단지 비공개과 공개 나의 방법에 대한 가시성을 사용합니다!Rails에서 보호 된 가시성을 사용하고 있습니까?
나는 이것이 나쁜 것 같다. 그러나 Rails에서는 문제가되지 않는 것 같습니다.
레일스에서 사용하지 않는 큰 실수가있는 사람이 누구입니까 가시성을 보호합니까?
업데이트 - true explanation of protected
/private
in Ruby에 링크 된 아래 댓글을 참조하십시오. 그것은 실제로 자바 시대에 남겨진 깊은 자리 잡은 편견이었습니다. 내 대답에 남은 유일한 부분은 동작이 아닌 컨트롤러 메서드가 public
이 아니어야합니다 (또는 적어도 경로가 해당 메서드를 보호해야 함).
단일 테이블 상속은 protected
이 모델 계층에서 유용 할 때 완벽한 예제입니다. 이는 상속의 가장 일반적인 용도 중 하나이기 때문입니다. 그들은 다른 컨트롤러에 액세스 할 수 없을 것입니다 private
인 경우에, 그러나 경우 public
레일 행위로 취급하므로 - 컨트롤러 계층에서
ApplicationController
에 정의 된 헬퍼 메소드는
protected
로 표시되어야한다.
개인적으로 필자는 레일 애플리케이션 에서조차 많은 친구들과 동료들보다 계급 상속을 많이 사용하고 있음을 발견했습니다. 내가 자주 사용하기 때문에 (그리고 자바 일에서 나오기 때문에), 나는 도우미 메서드를 사용하여 누구나 (보통 나 자신) 클래스를 확장하고자하는 사람에게 자유를주기 위해 protected
을 선호한다. 나는 그것을 private
으로 표시한다. :)
나는 SingleTableInheritance이
Person 클래스 < AR : 기본 클래스 교사 < 사람 CALSS 학생 < 사람
내가 학생 및 교사에 대한 일반적인 개인 방법을 구현하기 위해 보호 방법을 사용 :
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
면책 조항 :이 기능을 구현하는 행위와 같은 플러그인이 있습니다. 저는 여기에 당신에게 사건을 보여주기 위해 사용하지만 좀 더 복잡한 풍경이 있습니다.
fyi 위의 예제가 올바르게 작동하지 않습니다. 문제없이 'Person.reject_leaves (...)'를 호출 할 수 있습니다. 루비의 'public/protected/private'은 키워드가 아니며 'self'의 상태를 수정하는 'self'에 대한 메소드 호출입니다. 당신이'자기를 def '할 때 당신이'self'를 바꾸기 때문에. reject_leaves' 당신은 더 이상'protected' 상태를 설정하지 않습니다. 당신이 원하는 것을 얻으려면 두 번째 예제 ('Prot2')와 같은 것이 필요합니다 : http://pastie.org/842952 –
그것은 많은 의미가 있습니다. (STI가 어떤 것인지 확실하지 않음). –
"ApplicationController에 정의 된 도우미 메소드는 protected로 표시되어야합니다. 다른 사람이 개인용이면 다른 컨트롤러가 액세스 할 수 없습니다."- fyi, 올바르지 않습니다. http://pastie.org/842898에서 예를 참조하십시오. 루비의 보호 된/개인은 상속이 아니라 '자기'와 수신자에 관한 것입니다. "Java와 같은 언어와 달리 상속은 Ruby에서 메소드 가시성을 결정하는 데 절대적으로 사용되지 않습니다." - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby –
고마워요, 요르단. 네가 옳아. 나는 작은 메모를 추가했습니다. –