为什么不能在(OpenStruct)对象中访问此值?

时间:2019-06-06 12:57:11

标签: ruby-on-rails

我有一个(OpenStruct)对象,似乎只能访问某些值。简化的版本如下:

#<Project::API::FormData::FormAnswer:0x007f94de911ed0 
    @form_answer=
        #<OpenStruct 
            user_id=130, 
            timer_value=[{"foo" => "bar"}]
        >
>

如果我想获得user_id,那很容易

> answer.user_id
130

那timer_value呢?

> answer.timer_value
NoMethodError: undefined method `timer_value' for #<Project::API::FormData::FormAnswer:0x007f94de911ed0>
> answer.timer_value
NoMethodError: undefined method `timer_value' for #<Project::API::FormData::FormAnswer:0x007f94de911ed0>

出于某种原因,也许出于某种原因,我需要先通过form_answer访问它:

> answer.form_answer.timer_value
NoMethodError: undefined method `form_answer' for #<Project::API::FormData::FormAnswer:0x007f94de911ed0>
---
> answer.first.timer_value
NoMethodError: undefined method `first' for #<Project::API::FormData::FormAnswer:0x007f94de911ed0>

我对OpenStruct没经验-这是原因吗?

2 个答案:

答案 0 :(得分:3)

  

我有一个(OpenStruct)对象

不,你不知道。您似乎有一个PORO * ,其中的field / instance_variable类型为OpenStruct。考虑到answer.user_id可以正常工作的事实,您可能在该课程中有了类似的内容:

delegate :user_id, to: :@form_answer

也就是说,FormAnswer类重新导出其内部字段之一的属性。但是,例如,不会重新导出timer_value。它也不会暴露@form_answer


*普通的旧红宝石对象

答案 1 :(得分:0)

感谢塞尔吉奥,我发现正如您所发表的那样-确实是定义类的一个问题-我以为我已经读完了,但还是一遍又一遍地读了。似乎创建该类的人都会留下一个错误,这些错误会导致方法定义:

        fields.each do |field_name|
          define_method(field_name) { @form_answer.public_send(field_name) }
        end

这一切都很好,但是fields数组的格式不正确,这意味着只有一些值可以通过。

> answer.respond_to?(:timer_value)
true

宾果!