Rails 3.1以降、class_inheritable_accessor
では、代わりにclass_attribute
を使用するようにとの警告が表示されます。しかし、class_attribute
は、私が実証する重要なやり方で異なって振る舞います。Rails 3.1でclass_inheritable_accessorの動作をどのようにレプリケートしますか?
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
なしで同じ振る舞いをどのように再現するべきですか?