我有一个(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没经验-这是原因吗?
答案 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
宾果!