use*_*097 8 ruby ruby-on-rails ruby-on-rails-3.1
为什么我不能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
Run Code Online (Sandbox Code Playgroud)
PS.我也尝试过使用self.check_url
它并没有用.
mia*_*t17 10
在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
Run Code Online (Sandbox Code Playgroud)
check_url
被定义为实例方法,并且您尝试从类方法访问它(该方法不是在类上定义的,而是在实例上定义的)。更改def check_url
为def self.check_url
或将其包含在class << self
块中。
您确定收到私有方法错误,还是实际上收到未定义方法错误(两者都是 aNoMethodError
但具有不同的消息)?