質問

なぜアクセスできないのですか 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_urlclass << 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