【问题标题】:How to fix "undefined method `key?'" in Rails with Grape如何用 Grape 在 Rails 中修复“未定义的方法‘key?’”
【发布时间】:2019-12-27 20:10:58
【问题描述】:

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

我不知道这是否重要,但是当我在present StatsNode.where... 行之前提出一个字符串raise 'test' 时,消息{"response_type":"error","response":"asdf"} 将作为响应出现。如果我在present 行之后提出字符串,则会出现初始错误消息。

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

我希望 api 返回一个带有数据而不是错误消息的 json。
错误消息来自哪里,我该如何解决这个问题?

编辑:
我正在使用:
- 红宝石 2.5.5
- Rails 5.2.3
- 最新消息
- 葡萄最新
- 葡萄实体最新

【问题讨论】:

  • 你使用什么版本的 Ruby 和 Ruby on Rails?

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


【解决方案1】:

在没有看到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"}

它告诉您您正在尝试在 Array 对象上调用 .key?

解决办法可能是改变这个调用:

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

到:

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

【讨论】:

  • StatsNode 不是 ActiveRecord,它继承自 Spyke::Base。所以没有可用的StatsNode.find_by
  • 那就试试where().first
  • 那么我建议发布 StatsNodeEntity 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多