在 Rails 中使用 API 时 nil:NilClass 的未定义方法“each”
undefined method `each' for nil:NilClass when using API in Rails
这显然是一个常见错误。但是,在检查我的代码时我无法解决这个问题。我正在尝试访问 ProPublica 的 API 以供国会使用。我的模型、视图和控制器非常简单,在访问 Google 新闻 API 时,这段代码对我很有用。
当我尝试在我的视图中使用“.each”方法遍历 JSON 响应时,我不断收到未定义的方法错误。我相信我正在按要求将正确的 headers 传递给 API。
我的模特:
class CongressTracker < ApplicationRecord
include HTTParty
def self.response
#congress = "most recent congress"
#chamber = "one each for congress and senate"
#type = "introduced, passed, etc."
congress_url = "https://api.propublica.org/congress/v1/115/senate/bills/passed.json"
HTTParty.get(congress_url,
:headers => {
"X-API-KEY" => "api-key-here"
})
end
end
class Bill < ApplicationRecord
include HTTParty
end
我的控制器:
class BillsController < ApplicationController
def index
@response = CongressTracker.response
end
end
我的看法:
<% @response["results"].each do |bill| %>
<p><%= bill["title"]%></p>
<p><%= bill["summary"]%></p>
<% end %>
我的路线:
resources :bills
错误详情:
Rendering bills/index.html.erb within layouts/application
Rendered bills/index.html.erb within layouts/application (2.0ms)
Completed 500 Internal Server Error in 312ms (ActiveRecord: 0.0ms)
ActionView::Template::Error (undefined method `each' for nil:NilClass):
1: <% @response["results"].each do |bill| %>
2: <p><%= bill["title"]%></p>
3: <p><%= bill["summary"]%></p>
4: <% end %>
app/views/bills/index.html.erb:1:in `_app_views_bills_index_html_erb__2110131784793159686_70138696839360'
预期的 JSON 响应示例(我可以在终端中开始工作):
{
"status":"OK",
"copyright":"Copyright (c) 2017 Pro Publica Inc. All Rights Reserved.",
"results":[
{
"congress": "115",
"chamber": "Senate",
"num_results": "20",
"offset": "0",
"bills": [
{
"bill_id": "hr2825-115",
"bill_type": "hr",
"number": "H.R.2825",
"bill_uri": "https://api.propublica.org/congress/v1/115/bills/hr2825.json",
"title": "DHS Authorization Act of 2017",
"summary": "",
},
您收到 undefined method 'each' for nil:NilClass
错误的原因很可能是因为响应是 {"message"=>"Forbidden"}
,因为您的 API 密钥不正确。
我测试了你的代码,只要你有正确的 API 密钥,一切正常。
您的观点有一些错误,很可能是因为您还没有结果。
要获取账单的标题和摘要,您需要这样的东西:
<% @response["results"].each do |result| %>
<% result["bills"].each do |bill| %>
<p><%= bill["title"]%></p>
<p><%= bill["summary"]%></p>
<% end %>
<% end %>
这显然是一个常见错误。但是,在检查我的代码时我无法解决这个问题。我正在尝试访问 ProPublica 的 API 以供国会使用。我的模型、视图和控制器非常简单,在访问 Google 新闻 API 时,这段代码对我很有用。
当我尝试在我的视图中使用“.each”方法遍历 JSON 响应时,我不断收到未定义的方法错误。我相信我正在按要求将正确的 headers 传递给 API。
我的模特:
class CongressTracker < ApplicationRecord
include HTTParty
def self.response
#congress = "most recent congress"
#chamber = "one each for congress and senate"
#type = "introduced, passed, etc."
congress_url = "https://api.propublica.org/congress/v1/115/senate/bills/passed.json"
HTTParty.get(congress_url,
:headers => {
"X-API-KEY" => "api-key-here"
})
end
end
class Bill < ApplicationRecord
include HTTParty
end
我的控制器:
class BillsController < ApplicationController
def index
@response = CongressTracker.response
end
end
我的看法:
<% @response["results"].each do |bill| %>
<p><%= bill["title"]%></p>
<p><%= bill["summary"]%></p>
<% end %>
我的路线:
resources :bills
错误详情:
Rendering bills/index.html.erb within layouts/application
Rendered bills/index.html.erb within layouts/application (2.0ms)
Completed 500 Internal Server Error in 312ms (ActiveRecord: 0.0ms)
ActionView::Template::Error (undefined method `each' for nil:NilClass):
1: <% @response["results"].each do |bill| %>
2: <p><%= bill["title"]%></p>
3: <p><%= bill["summary"]%></p>
4: <% end %>
app/views/bills/index.html.erb:1:in `_app_views_bills_index_html_erb__2110131784793159686_70138696839360'
预期的 JSON 响应示例(我可以在终端中开始工作):
{
"status":"OK",
"copyright":"Copyright (c) 2017 Pro Publica Inc. All Rights Reserved.",
"results":[
{
"congress": "115",
"chamber": "Senate",
"num_results": "20",
"offset": "0",
"bills": [
{
"bill_id": "hr2825-115",
"bill_type": "hr",
"number": "H.R.2825",
"bill_uri": "https://api.propublica.org/congress/v1/115/bills/hr2825.json",
"title": "DHS Authorization Act of 2017",
"summary": "",
},
您收到 undefined method 'each' for nil:NilClass
错误的原因很可能是因为响应是 {"message"=>"Forbidden"}
,因为您的 API 密钥不正确。
我测试了你的代码,只要你有正确的 API 密钥,一切正常。
您的观点有一些错误,很可能是因为您还没有结果。
要获取账单的标题和摘要,您需要这样的东西:
<% @response["results"].each do |result| %>
<% result["bills"].each do |bill| %>
<p><%= bill["title"]%></p>
<p><%= bill["summary"]%></p>
<% end %>
<% end %>