我为什么不能访问 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 而且它不起作用。

有帮助吗?

解决方案

在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_urldef self.check_url 或将其包括在 class << self 堵塞。

您确定自己遇到了私有方法错误吗?还是实际上遇到了未定义的方法错误(两者都将是一个 NoMethodError 但是有不同的消息)?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top