2011-11-30 10 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 
    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_urlcheck_urlclass << selfスコープに移動します)。 def check_urldef self.check_urlに変更するか、class << selfブロックに組み込みます。

プライベートメソッドエラーが発生していますか、実際には未定義メソッドエラーが発生していますか(どちらもNoMethodErrorですが、メッセージは異なります)。

関連する問題