Impossible d'accéder à la méthode privée de classe à l'intérieur?
-
25-10-2019 - |
Question
Pourquoi accéder je ne peux pas la méthode privée check_url
dans le code ci-dessous à partir d'une méthode encapsulée de classe?
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. J'ai aussi essayé d'utiliser self.check_url
et ça n'a pas marché.
La solution
Dans Ruby, les méthodes privées ne peut pas être appelé avec un récepteur explicite. Donc, vous ne pouvez pas appeler self.check_url
. Au lieu de cela, il suffit d'appeler check_url
.
Votre autre problème est que vous avez défini check_url
comme une méthode d'instance, et l'a appelé dans une méthode de classe. Déplacez le check_url
dans le périmètre de 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
Autres conseils
check_url
est définie comme une méthode d'instance, et que vous essayez d'y accéder à partir d'une méthode de classe (la méthode est pas définie sur la classe, il est défini sur une instance). Changement def check_url
à def self.check_url
ou l'inclure dans le bloc class << self
.
Etes-vous sûr que vous obtenez une erreur de méthode privée, ou êtes-vous fait une erreur de méthode non définie (les deux sera un NoMethodError
mais avec des messages différents)?