0

我正在使用 Ruby on Rails 创建一个 API。我使用 gem 'grape' 向消费者提供 api,并使用 'spyke' 从另一个 api 接收数据。我对从 spyke 收到的数据进行处理和丰富,然后将其传递给葡萄。
问题是,我收到一个错误:undefined method key?.

我已经检查了我从 spyke 收到的数据。数据似乎没问题(我没有收到数组,我得到了一个哈希)。我已经用puts resultand打印了它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'在 line 之前提出一个字符串时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
- 最新的葡萄 - 最新
的葡萄实体

4

1 回答 1

0

在没有看到StatsNodeor的代码的情况下StatsNodeEntity,我将假设以下情况是正确的:

  • StatsNode是一个 ActiveRecord(或 ActiveRecord-like)模型
  • 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])

至:

StatsNode.find_by(cluster_id: params[:cluster_id], node: params[:node])
于 2019-08-22T16:24:05.643 回答