内部クラスからプライベートメソッドにアクセスできませんか?
-
25-10-2019 - |
質問
なぜアクセスできないのですか 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
詩私も使用しようとしました self.check_url
そして、それはうまくいきませんでした。
解決
Rubyでは、明示的なレシーバーではプライベートメソッドを呼び出すことはできません。だからあなたは電話することはできません self.check_url
. 。代わりに、電話してください check_url
.
あなたの他の問題はあなたが定義されていることです check_url
インスタンスメソッドとして、クラスメソッドでそれを呼びました。移動します check_url
に class << 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
他のヒント
check_url
インスタンスメソッドとして定義されており、クラスメソッドからアクセスしようとしています(メソッドはクラスで定義されておらず、インスタンスで定義されています)。変化する def check_url
に def self.check_url
またはそれをに含めます class << self
ブロック。
プライベートメソッドエラーが発生しているのですか、それとも実際に未定義のメソッドエラーを取得していますか(両方とも NoMethodError
しかし、異なるメッセージがあります)?
所属していません StackOverflow