Почему я не могу получить доступ к этому значению в (OpenStruct) объекте? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть объект (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 ]

3 голосов
/ 06 июня 2019

У меня есть объект (OpenStruct)

Нет, нет. Кажется, у вас есть PORO *, который имеет поле / instance_variable типа OpenStruct. И учитывая тот факт, что answer.user_id работает, у вас, вероятно, есть что-то подобное в этом классе:

delegate :user_id, to: :@form_answer

То есть класс FormAnswer повторно экспортирует свойство одного из своих внутренних полей. Но не реэкспортирует timer_value, например. Это также не разоблачает @form_answer.


* обычный старый рубиновый объект

0 голосов
/ 06 июня 2019

Спасибо, Серхио, я обнаружил, что так же, как вы писали, - действительно проблема в том, где определен класс, - которую я думал, что прочитал бы, но как всегда читал и читал снова.Кажется, кто бы ни создавал класс, он оставлял ошибку, искажающую определения методов:

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

Все это хорошо, но массив fields был искажен, означая, что только некоторые значения были получены.

> answer.respond_to?(:timer_value)
true

Бинго!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...