Как получается, что методы под "частным" и "защищенным" всегда могут быть вызваны в моделях (рельсах)?

Я проверил, что они на самом деле не работают:

class User < ActiveRecord::Base

  def self.call_protected_method
    protected_method
  end

  def self.call_private_method
    private_method
  end

  protected

  def self.protected_method
    puts "protected_method"
  end

  private

  def self.private_method
    puts "private_method"
  end

end

Я имею в виду, что они не работают, это вы можете вызывать все методы в этом примере. Не имеет значения, находятся ли они под частным или защищенным доступом.

# in rails console:
User.call_protected_method # => protected_method
User.protected_method      # => protected_method
User.call_private_method   # => private_method
User.private_method        # => private_method

Это почему? В чем причина игнорирования «частных» и «защищенных»?

ОБНОВЛЕНИЕ: мой вопрос не в том, как это сделать. У меня вопрос, почему этот подход не работает в моделях рельсов !?


person ExClouds    schedule 20.04.2016    source источник
comment
Что вы ожидали, что произошло вместо этого?   -  person Nils Landt    schedule 20.04.2016
comment
Я имею в виду, что они не работают, это то, что вы можете вызывать все методы в этом примере. Не имеет значения, находятся ли они под частным или защищенным доступом. Это почему? В чем причина этого?   -  person ExClouds    schedule 20.04.2016


Ответы (1)


Вы пытаетесь определить метод частного класса, и это не сработает с этим синтаксисом. Вам нужен private_class_method

Взгляните также на эти ответы: Класс Ruby со статическим методом вызов частного метода?

person eugen    schedule 20.04.2016
comment
мой вопрос не в том, как это сделать. У меня вопрос, почему этот подход не работает в моделях рельсов !? - person ExClouds; 20.04.2016
comment
Rails тут ни при чем, это фича рубинового языка. Эта статья может объяснить причины, по которым существует такое поведение: jakeyesbeck.com/ 24.01.2016 / ruby-private-class-methods - person eugen; 20.04.2016