Невозможно получить доступ к частному методу из внутреннего класса?

StackOverflow https://stackoverflow.com/questions/8319578

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top