Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何复制类可继承访问器';Rails 3.1中的行为?_Ruby On Rails_Ruby_Inheritance_Ruby On Rails 3.1 - Fatal编程技术网

Ruby on rails 如何复制类可继承访问器';Rails 3.1中的行为?

Ruby on rails 如何复制类可继承访问器';Rails 3.1中的行为?,ruby-on-rails,ruby,inheritance,ruby-on-rails-3.1,Ruby On Rails,Ruby,Inheritance,Ruby On Rails 3.1,从Rails 3.1开始,class\u inheritable\u访问器产生弃用警告,告诉我改用class\u属性。但是,class\u属性在我将演示的一种重要方式中表现不同 class\u inheritable\u属性的典型用法是presenter类,如下所示: module Presenter class Base class_inheritable_accessor :presented self.presented = {} def self.prese

从Rails 3.1开始,
class\u inheritable\u访问器
产生弃用警告,告诉我改用
class\u属性
。但是,
class\u属性
在我将演示的一种重要方式中表现不同

class\u inheritable\u属性的典型用法是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\u可继承的\u访问器
,我应该如何复制相同的行为?

class\u属性
如果按预期使用,不会污染其父属性。确保您没有在适当的位置更改可变项

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

尝试一下,这是一种在类上设置属性的好方法,并且不会被继承或实例污染

class Class

  private

  # Sets Unique Variables on a resource
  def inheritable_attr_accessor(*attrs)
    attrs.each do |attr|

      # Class Setter, Defining Setter
      define_singleton_method "#{attr}=".to_sym do |value|
        define_singleton_method attr do
          value
        end
      end

      # Default to nil
      self.send("#{attr}=".to_sym, nil)

      # Instance Setter
      define_method "#{attr}=".to_sym do |value|
        eval("@_#{attr} = value")
      end

      # Instance Getter, gets class var if nil
      define_method attr do
        eval("defined?(@_#{attr})") ? eval("@_#{attr}") : self.class.send(attr)
      end

    end
  end

end
class Class

  private

  # Sets Unique Variables on a resource
  def inheritable_attr_accessor(*attrs)
    attrs.each do |attr|

      # Class Setter, Defining Setter
      define_singleton_method "#{attr}=".to_sym do |value|
        define_singleton_method attr do
          value
        end
      end

      # Default to nil
      self.send("#{attr}=".to_sym, nil)

      # Instance Setter
      define_method "#{attr}=".to_sym do |value|
        eval("@_#{attr} = value")
      end

      # Instance Getter, gets class var if nil
      define_method attr do
        eval("defined?(@_#{attr})") ? eval("@_#{attr}") : self.class.send(attr)
      end

    end
  end

end