2011-11-30 2 views
8

클래스 캡슐화 된 메서드에서 아래 코드의 check_url 개인 메서드에 액세스 할 수없는 이유는 무엇입니까?내부 클래스에서 개인 메서드에 액세스 할 수 없습니까?

class Link < MyModel 

    # whitelist fields for security 
    attr_accessible :is_valid, 
        :url 

    # validations 
    validates :is_valid, :inclusion => { :in => [true, false] } 
    validates :url,  :presence => true 


    # =============================================================== 
    # = class methods (accessible from outside without an instance) = 
    # =============================================================== 
    class << self 

    def is_url_valid(url) 
     unless link = Link.find_by_url(url) 
     link = Link.create!(:url => url, :is_valid => check_url(url)) 
     end 
     link.is_valid 
    end 

    end 


    # ===================== 
    # = Private functions = 
    # ===================== 
    private 

    # Checks if url is broken 
    def check_url(url) 
     # do stuff 
    end 

end 

PS. 또한 self.check_url을 사용해 보았는데 작동하지 않았습니다.

답변

9

Ruby에서 개인 메서드는 명시 적 수신기로 호출 할 수 없습니다. 따라서 self.check_url으로 전화 할 수 없습니다. 대신 check_url으로 전화하십시오.

다른 문제는 check_url을 인스턴스 메소드로 정의하고이를 클래스 메소드에서 호출했습니다. class << self 범위에 check_url 이동 :

class << self 
    def is_url_valid(url) 
    unless link = Link.find_by_url(url) 
     link = Link.create!(:url => url, :is_valid => check_url(url)) 
    end 
    link.is_valid 
    end 

    private 
    # Checks if url is broken 
    def check_url(url) 
    # do stuff 
    end 
end 
+0

코드가 이미 있습니다. 작동하지 않습니다. 나는'self.check_url'과'check_url'을 모두 시도했습니다. – user1049097

+0

제 답변이 업데이트되었습니다. – miaout17

+0

감사. 그게 효과가있어 - 내가 자체 참조 클래스 내에 포함되어 있지 않으면 기본 클래스에서 개인 함수에 액세스 할 수 없다는 것을 몰랐다. – user1049097

3

check_url가 인스턴스 메소드로 정의됩니다, 당신은 (메소드가 클래스에 정의되지 않은 클래스 메소드에서 액세스하려는, 그것은 인스턴스에 정의되어). def check_urldef self.check_url으로 변경하거나 class << self 블록에 포함하십시오.

개인용 메소드 오류가 발생 했습니까? 실제로는 정의되지 않은 메소드 오류가 발생합니까 (둘 다 NoMethodError이지만 메시지가 다릅니다)?

관련 문제