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.

War es hilfreich?

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)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top