Список атрибутов из класса и включаемого модуля - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть класс (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 и: Direct_by и не включает: image_url и: summary_text?

Я изменил свойства BaseClueProperties следующим образом:

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

Но все же с тем же результатом.

Есть какие-нибудь мысли о том, почему атрибуты my: image_url и: summary_text не добавляются в мою коллекцию @attributes?

1 Ответ

5 голосов
/ 27 апреля 2010

Я не могу обещать, что мое описание причины верно, но следующий код должен решить проблему. Я считаю, что вы добавляете атрибуты в модуль, а не в класс, в который он включен. В любом случае замена вашего модуля на следующую должна решить проблему.

module BaseClueProperties

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

end 

Это должно привести к тому, что включающий объект определит attribute_accessors, когда он включает модуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...