【问题标题】:Inherited class doesn't have attributes?继承的类没有属性?
【发布时间】:2017-02-09 14:29:24
【问题描述】:

我正在使用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 类,但我不确定我是否清楚了解它如何将我对类的方法调用映射到属性哈希,或者为什么我的扩展类不这样做同样的事情。

【问题讨论】:

    标签: ruby inheritance polymorphism jira


    【解决方案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 显然是在初始化对象时设置的。您如何初始化示例中的对象?

    【讨论】:

    • 完美答案。我阅读了method_missing 方法并能够确定我没有正确实例化@attrs 变量。在initialize 方法中添加对super 的调用解决了该问题。
    猜你喜欢
    • 2022-12-18
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多