Унаследованный класс не имеет атрибутов?

#ruby #inheritance #polymorphism #jira

#ruby #наследование #полиморфизм #jira

Вопрос:

Я использую библиотеку jira-ruby и расширил JIRA::Resource::Issue класс, как определено ниже.

 class ServerRequest < JIRA::Resource::Issue
  def requested_os
    customfield_11169
  end
end
  

Когда я создаю новый ServerRequest объект, я не могу получить доступ к атрибутам, как я могу, когда объект имеет тип JIRA::Resource::Issue

Пример.

 [81] pry(main)> ticket.class
=> JIRA::Resource::Issue
[80] pry(main)> ticket.customfield_11169
=>{"self"=>"http://REDACTED:8080/rest/api/2/customFieldOption/14451",
"value"=>"Linux - CentOS","id"=>"14451"}
[81] pry(main)> request = ServerRequest.new(ticket)
[82] pry(main)> request.class
=> ServerRequest
[83] pry(main)> request.customfield_11169
NoMethodError: undefined method `customfield_11169' for #<ServerRequest:0x005634b57431b0>
from /home/user/.gem/ruby/gems/jira-ruby-1.1.0/lib/jira/base.rb:308:in `method_missing'
  

Я пытался прочитать JIRA::Resource::Base класс, но я не уверен, что у меня есть четкое представление о том, как он сопоставляет вызовы моего метода для класса с хэшем атрибута или почему мой расширенный класс не делает то же самое.

Ответ №1:

В ruby, когда вызываемый метод не найден, method_missing вызывается метод, передающий имя метода, аргументы и блок, используемый в вызове. JIRA::Resource::Issue , имеет определение для method_missing :

https://github.com/sumoheavy/jira-ruby/blob/master/lib/jira/resource/issue.rb#L89

В определении можно проверить, что сначала выполняется поиск attrs['fields'] значения по хэшу, и если он не найден, он вызывает method_missing родительский класс, в котором выполняется поиск attrs .

attrs по-видимому, устанавливается при инициализации объекта. Как вы инициализируете объекты в вашем примере?

Комментарии:

1. Идеальный ответ. Я прочитал method_missing метод и смог определить, что я неправильно создал экземпляр @attrs переменной. Добавление вызова super в initialize метод решило проблему.