Используете ли вы когда-либо защищенную видимость в Rails?

Исповедь: я использую только конфиденциальную и общедоступную видимость для моих методов!

У меня такое чувство, что это плохо. Но в Rails это просто не похоже на проблему.

Есть ли у кого-нибудь пример в Rails, где было бы большой ошибкой не использовать видимость protected?

Ответы

Ответ 1

Обновить. См. комментарий ниже, который ссылается на истинное объяснение protected/private в Ruby. Это было глубоко укоренившееся предрассудок, оставшееся от моих дней Java. Единственная важная часть моего ответа заключается в том, что методы контроллера, которые не являются действиями, не должны быть public (или, по крайней мере, ваши маршруты должны их защищать).

Единственное наследование таблицы - прекрасный пример того, когда protected полезно в уровне модели, поскольку это одно из наиболее распространенных применений наследования там.

В уровне контроллера вспомогательные методы, определенные в ApplicationController, должны быть помечены как protected - если они были private, другие контроллеры не смогут получить к ним доступ, но если они public Rails будут рассматривать их как действия.

Лично я считаю, что я использую наследование класса больше, чем многие мои друзья и коллеги, даже в приложениях Rails. Поскольку я часто использую его (и выхожу из своих Java-дней), я предпочитаю protected для всех вспомогательных методов, предоставляющих свободу любому (обычно самому), который хочет расширить класс, - если я действительно не смущен одной, тогда я отмечаю его private.:)

Ответ 2

У меня есть SingleTableInheritance

class Person < AR:: база класс Учитель < Человек calss Student < Person

И я использую защищенные методы для реализации частного метода, который является общим для Студента и Учителя:

class Person < AR::base
  def self.find(*args)
    reject_leaves(super(*args))
  end
protected
  def self.reject_leaves(target) #like a private in Teacher and Student
    case target
      when Array target.select{|t| reject_leaves(t)}
      when Person (target.leave_date < Date.today ? target : nil)
      else target
    end
  end
end

Отказ от ответственности. Существуют плагины, такие как act-as-paranoid и другие, для реализации функции, которую я использую здесь, чтобы показать вам случай, но у меня есть более сложный ландшафт, который я упростил здесь, чтобы перейти к вашей точке.