Unlike send, public_send calls public methods only.
Source
Example:
class Klass
private
def private_method
puts "Hello"
end
end
k = Klass.new
k.send(:private_method)
# => "Hello"
k.public_send(:private_method)
# => `public_send': private method `private_method' called for #<Klass:0x007f5fd7159a80> (NoMethodError)
You may want to prefer #public_send over #send so as not to circumvent private/protected visibility.