JohnSmith
JohnSmith

Reputation: 1268

Can't call private class method

Getting the following error when trying to call a private method inside the same class:

undefined local variable or method a_private_method' for AClass (NameError)`

Here the class:

class AClass
  def self.public_method
    file = a_private_method
  end

  private

  def a_private_method
    do something
  end
end

Upvotes: 1

Views: 2064

Answers (1)

Christian Bruckmayer
Christian Bruckmayer

Reputation: 2187

You are trying to call an instance method from a class method, this does of course not work.

Try this

class AClass
  class << self
    def public_method
      file = a_private_method
    end

    private

    def a_private_method
      # do something
    end
  end
end

You can also use self as the receiver similar to what you already did but pleases be aware that moving the method to the private part of your class does not work in this case. You could use private_class_method though.

class AClass
    def self.public_method
      file = a_private_method
    end

    def self.a_private_method
      # do something
    end
    private_class_method :a_private_method
  end
end

See https://jakeyesbeck.com/2016/01/24/ruby-private-class-methods and https://dev.to/adamlombard/ruby-class-methods-vs-instance-methods-4aje.

Upvotes: 8

Related Questions