2011-11-30 71 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定义为实例方法,并在类方法中调用它。移动check_urlclass << self范围:

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_url更改为def self.check_url或将其包含在class << self块中。

你确定你得到一个私人方法错误,或者你实际上得到一个未定义的方法错误(两个将是一个NoMethodError但用不同的消息)?