我正在使用Ruby on Rails创建一个API。我使用gem'grape'向消费者提供api,并使用'spyke'从另一个API接收数据。我操纵并丰富了从spyke接收的数据,然后将其传递给grape。
问题是,我收到一个错误: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
-最新资讯
-葡萄最新
-最新的葡萄实体
答案 0 :(得分:0)
在没有看到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])
收件人:
StatsNode.find_by(cluster_id: params[:cluster_id], node: params[:node])