Как исправить неопределенный метод `key?' в рельсах с виноградом

Я создаю API с Ruby on Rails. Я использую драгоценный камень «виноград» для предоставления API потребителю и «spyke» для получения данных от другого API. Я обрабатываю и обогащаю данные, которые я получаю от spyke, а затем передаю их винограду.
Проблема в том, что я получаю сообщение об ошибке: undefined method key?.

Я уже проверил данные, которые я получаю от spyke. Данные выглядят нормально (я не получаю массив, я получаю хэш). Я напечатал его с puts result и result.class (результат — данные, которые получает spyke).
Я погуглил сообщение об ошибке undefined method key?. Я пробовал все «решения», предоставленные stackoverflow и другими ресурсами. Ни один из них не работал. Я даже не знаю, где именно возникла ошибка.

resource :clusters do
  route_param :cluster_id do
    resource :stats do
      params do
        requires :node, type: String, desc: 'Node name.'
      end
      route_param :node do
        get do
          present StatsNode.where(cluster_id: params[:cluster_id], node: params[:node]), with: StatsNodeEntity
        end
      end
    end
  end
end

Не знаю, важно ли это, но когда я поднимаю строку raise 'test' перед строкой present StatsNode.where..., в качестве ответа появляется сообщение {"response_type":"error","response":"asdf"}. Если я поднимаю строку после строки present, появляется начальное сообщение об ошибке.

Точное сообщение гласит: {"response_type":"error","response":"undefined method key?' for [\"_nodes\", {\"total\"=\u003e1, \"successful\"=\u003e1, \"failed\"=\u003e0}]:Array"}

Я ожидаю, что API вернет json с данными, а не с сообщением об ошибке.
Откуда это сообщение об ошибке и как я могу решить эту проблему?

РЕДАКТИРОВАТЬ:
Я использую:
- Ruby 2.5.5
- Rails 5.2.3
- последняя версия spyke
- последняя версия винограда
- версия винограда -объект последний


person jobs    schedule 22.08.2019    source источник
comment
Какую версию Ruby и Ruby on Rails вы используете?   -  person spickermann    schedule 22.08.2019


Ответы (1)


Не видя кода для StatsNode или StatsNodeEntity, я собираюсь предположить, что верно следующее:

  • StatsNode — это модель ActiveRecord (или подобная ActiveRecord)
  • StatsNode.where() возвращает перечисляемое, подобное ActiveRecord::Relation (с поведением, подобным массиву)

Учитывая это, проблема, скорее всего, в том, что ваш вызов where() возвращает объект, подобный массиву, когда вы ожидаете, что он вернет один объект, подобный хешу. Это видно из ошибки:

{"response_type":"error","response":"undefined method key?' for [\"_nodes\", {\"total\"=\u003e1, \"successful\"=\u003e1, \"failed\"=\u003e0}]:Array"}

Он сообщает вам, что вы пытаетесь вызвать .key? для объекта Array.

Решение, вероятно, состоит в том, чтобы изменить этот вызов:

StatsNode.where(cluster_id: params[:cluster_id], node: params[:node])

to:

StatsNode.find_by(cluster_id: params[:cluster_id], node: params[:node])
person anothermh    schedule 22.08.2019
comment
StatsNode не является ActiveRecord, он наследуется от Spyke::Base. Итак, StatsNode.find_by нет в наличии. - person jobs; 23.08.2019
comment
Затем попробуйте where().first. - person anothermh; 23.08.2019
comment
Тогда я рекомендую опубликовать класс StatsNodeEntity. - person anothermh; 23.08.2019