2016-09-30 3 views
0

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

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

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

Ex.

[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

В рубине, когда вызванный метод не найден, вызывается метод 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, очевидно, установлен, когда объект инициализирован. Как вы инициализируете объекты в своем примере?

+0

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

Смежные вопросы