Pregunta

¿Por qué no puedo acceder al check_url ¿Método privado en el código a continuación de un método encapsulado de clase?

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

PD. También he intentado usar self.check_url Y no funcionó.

¿Fue útil?

Solución

En Ruby, los métodos privados no pueden llamarse con un receptor explícito. Para que no puedas llamar self.check_url. En cambio, solo llama check_url.

Tu otro problema es que definiste check_url Como método de instancia, y lo llamó en un método de clase. Mueve el check_url en el class << self alcance:

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

Otros consejos

check_url se define como un método de instancia e intenta acceder a él desde un método de clase (el método no se define en la clase, se define en una instancia). Cambio def check_url a def self.check_url o incluirlo en el class << self bloquear.

¿Está seguro de que está recibiendo un error de método privado, o realmente está recibiendo un error de método indefinido (ambos serán un NoMethodError ¿Pero con diferentes mensajes)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top