无法从内部班级访问私人方法?
-
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
PS。我也尝试使用 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