Начиная с Rails 3.1, class_inheritable_accessor
выдает предупреждения об устаревании, подсказывая мне использовать class_attribute
. Но class_attribute
ведет себя по-другому важным способом, который я продемонстрирую.
Типичное использование class_inheritable_attribute
- это класс докладчика, например:
module Presenter
class Base
class_inheritable_accessor :presented
self.presented = {}
def self.presents(*types)
types_and_classes = types.extract_options!
types.each {|t| types_and_classes[t] = t.to_s.tableize.classify.constantize }
attr_accessor *types_and_classes.keys
types_and_classes.keys.each do |t|
presented[t] = types_and_classes[t]
end
end
end
end
class PresenterTest < Presenter::Base
presents :user, :person
end
Presenter::Base.presented => {}
PresenterTest.presented => {:user => User, :person => Person}
Но используя class_attribute
, подклассы будут загрязнять их родителей:
Presenter::Base => {:user => User, :person => Person}
Что не является желаемым поведением вообще. Есть ли другой тип аксессора, который ведет себя правильно, или мне нужно переключиться на другой паттерн вообще? Как мне повторить то же поведение без class_inheritable_accessor
?