如何用Grape修复Rails中的“未定义方法“键?””

时间:2019-08-22 13:23:45

标签: ruby-on-rails ruby grape grape-entity

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

我已经检查了从spyke收到的数据。数据似乎还可以(我没有收到数组,得到了哈希)。我已经用puts resultresult.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
-最新资讯
-葡萄最新
-最新的葡萄实体

1 个答案:

答案 0 :(得分:0)

在没有看到StatsNodeStatsNodeEntity的代码的情况下,我将假定以下内容为真:

  • 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])

收件人:

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