Aus dem Unterricht kann nicht auf private Methoden zugreifen?
-
25-10-2019 - |
Frage
Warum kann ich nicht auf das zugreifen? check_url
private Methode im folgenden Code aus einer Klasse eingekapselte Methode?
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. Ich habe auch versucht zu benutzen self.check_url
Und es hat nicht funktioniert.
Lösung
In Ruby können private Methoden nicht mit einem expliziten Empfänger aufgerufen werden. Sie können also nicht anrufen self.check_url
. Rufen Sie stattdessen einfach an check_url
.
Ihr anderes Problem ist, dass Sie definiert sind check_url
als Instanzmethode und nannte es in einer Klassenmethode. Beweg den check_url
in die class << self
Umfang:
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
Andere Tipps
check_url
wird als Instanzmethode definiert, und Sie versuchen, aus einer Klassenmethode darauf zugreifen zu können (die Methode ist nicht in der Klasse definiert, sie ist auf einer Instanz definiert). Veränderung def check_url
zu def self.check_url
oder in die einbeziehen class << self
Block.
Sind Sie sicher, dass Sie einen privaten Methodenfehler erhalten oder tatsächlich einen undefinierten Methodenfehler erhalten (beide sind a NoMethodError
aber mit unterschiedlichen Nachrichten)?