Не удается получить доступ к приватному методу из класса? - PullRequest
8 голосов
/ 30 ноября 2011

Почему я не могу получить доступ к приватному методу 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

PS.Я также попытался использовать self.check_url, и это не сработало.

Ответы [ 2 ]

10 голосов
/ 30 ноября 2011

В 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
3 голосов
/ 30 ноября 2011

check_url определен как метод экземпляра, и вы пытаетесь получить к нему доступ из метода класса (метод не определен в классе, он определен в экземпляре).Измените def check_url на def self.check_url или включите его в блок class << self.

Вы уверены, что получаете ошибку частного метода, или действительно получаете неопределенную ошибку метода (оба будутNoMethodError но с разными сообщениями)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...