#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
метод решило проблему.