Невозможно получить доступ к частному методу из внутреннего класса?
-
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
Пса Я также пытался использовать 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
Но с разными сообщениями)?