来自class和include模块的属性列表

时间:2010-04-27 07:55:13

标签: ruby-on-rails ruby

我有一个类(ActorClue),其中定义了三个attr_accessor。其他类还需要几个其他常见字段,因此我将这些常用字段放在模块中(BaseClueProperties)。我在我的ActorClue类中包含了该模块。

以下是代码示例:

module BaseClueProperties  
  attr_accessor :image_url
  attr_accessor :summary_text  
end

################
class BaseClue

  # http://stackoverflow.com/questions/2487333/fastest-one-liner-way-to-list-attr-accessors in-ruby    
  def self.attr_accessor(*vars)
    @attributes ||= []

    @attributes.concat vars

    super(*vars)
  end

  def self.attributes
    @attributes
  end

  def attributes
    self.class.attributes
  end

end

###############

class ActorClue < BaseClue

  attr_accessor :actor_name
  attr_accessor :movie_name
  attr_accessor :directed_by

  include BaseClueProperties

  .....
end

我用以下内容实例化上述内容:

>> gg = ActorClue.new
=> #<ActorClue:0x23bf784>
>> gg.attributes
=> [:actor_name, :movie_name, :directed_by] 

为什么它只返回:actor_name,:movie_name和:directed_by而不包括:image_url和:summary_text?

我修改了BaseClueProperties以阅读以下内容:

module BaseClueProperties  
  BaseClue.attr_accessor :image_url
  BaseClue.attr_accessor :summary_text  
end

但仍然有相同的结果。

为什么我的:image_url和:summary_text属性没有被添加到我的@attributes集合中的任何想法?

1 个答案:

答案 0 :(得分:5)

我不能保证我对原因的描述是正确的,但下面的代码应该解决问题。我相信您正在向模块添加属性而不是包含在其中的类。无论如何用以下方法替换你的模块应该可以解决问题。

module BaseClueProperties

  def self.included(base)
    base.send :attr_accessor, :image_url
    base.send :attr_accessor, :summary_text
  end

end 

这会导致include对象在包含模块时定义attribute_accessors。