Question

Pourquoi accéder je ne peux pas la méthode privée check_url dans le code ci-dessous à partir d'une méthode encapsulée de classe?

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. J'ai aussi essayé d'utiliser self.check_url et ça n'a pas marché.

Était-ce utile?

La solution

Dans Ruby, les méthodes privées ne peut pas être appelé avec un récepteur explicite. Donc, vous ne pouvez pas appeler self.check_url. Au lieu de cela, il suffit d'appeler check_url.

Votre autre problème est que vous avez défini check_url comme une méthode d'instance, et l'a appelé dans une méthode de classe. Déplacez le check_url dans le périmètre de 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

Autres conseils

check_url est définie comme une méthode d'instance, et que vous essayez d'y accéder à partir d'une méthode de classe (la méthode est pas définie sur la classe, il est défini sur une instance). Changement def check_url à def self.check_url ou l'inclure dans le bloc class << self.

Etes-vous sûr que vous obtenez une erreur de méthode privée, ou êtes-vous fait une erreur de méthode non définie (les deux sera un NoMethodError mais avec des messages différents)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top