¿No se puede acceder al método privado desde la clase interior?
-
25-10-2019 - |
Pregunta
¿Por qué no puedo acceder al check_url
¿Método privado en el código a continuación de un método encapsulado de clase?
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
PD. También he intentado usar self.check_url
Y no funcionó.
Solución
En Ruby, los métodos privados no pueden llamarse con un receptor explícito. Para que no puedas llamar self.check_url
. En cambio, solo llama check_url
.
Tu otro problema es que definiste check_url
Como método de instancia, y lo llamó en un método de clase. Mueve el check_url
en el class << self
alcance:
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
Otros consejos
check_url
se define como un método de instancia e intenta acceder a él desde un método de clase (el método no se define en la clase, se define en una instancia). Cambio def check_url
a def self.check_url
o incluirlo en el class << self
bloquear.
¿Está seguro de que está recibiendo un error de método privado, o realmente está recibiendo un error de método indefinido (ambos serán un NoMethodError
¿Pero con diferentes mensajes)?