Попробуйте это, отличный способ иметь атрибуты, установленные в классе, и не загрязненные наследованием или экземплярами.

ая с 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?

Ответы на вопрос(2)

Ваш ответ на вопрос