从Rails3.1开始,class_inheritable_accessor会产生不推荐警告,告诉我改用class_attribute。但在我将要演示的一个重要方面,class_attribute的行为不同。
class_inheritable_attribute的典型用法是Presenter类,如下所示:

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,我应该如何复制相同的行为?

最佳答案

class_attribute如果按预期使用,不会污染它的父母。确保您没有在适当的位置更改可变项。

types_and_classes.keys.each do |t|
  self.presented = presented.merge({t => types_and_classes[t]})
end

10-05 23:36