неопределенный метод «каждый» для nil:NilClass при использовании API в Rails

Очевидно, это распространенная ошибка. Однако я не могу решить эту проблему при просмотре моего кода. Я пытаюсь получить доступ к API ProPublica для конгресса. Моя модель, представление и контроллер довольно просты, и именно этот код работал со мной при доступе к Google News API.

Я продолжаю получать ошибку неопределенного метода, когда пытаюсь использовать метод «.each» в своем представлении для повторения ответа JSON. Я считаю, что передаю правильные заголовки 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": "",
              },

person T. Cole    schedule 16.07.2017    source источник
comment
Каково содержимое @response, разве вам не нужно его анализировать?   -  person Sebastian Palma    schedule 16.07.2017
comment
Я считаю, что у HTTParty есть собственный способ разбора JSON. Этот точный код работает с Google News API, который я также использую, поэтому я не думаю, что это проблема с анализом ответа JSON.   -  person T. Cole    schedule 16.07.2017
comment
Одна вещь, которую вы можете попробовать, - это добавить <%= debug @response %> в представление и проверить структуру ответа, и оттуда, если она отключена, вы сможете отследить, что изменилось или почему это отличается от того, что вы ожидаете оттуда   -  person Simple Lime    schedule 16.07.2017
comment
К сожалению, попытка отладки не дала мне никакой дополнительной информации.   -  person T. Cole    schedule 17.07.2017
comment
Можете ли вы заменить содержимое вашего представления на <%= @response.parsed_response %> и рассказать нам, что оно отображает.   -  person Lasse Sviland    schedule 17.07.2017


Ответы (1)


Причина, по которой вы получаете ошибку 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 %>
person Lasse Sviland    schedule 16.07.2017
comment
Я дважды проверю свой ключ и изменю свое мнение. Благодарю вас! Это дало мне паузу в течение нескольких часов. - person T. Cole; 17.07.2017
comment
Я отметил это как ответ вчера, но не смог проверить и убедиться до сегодняшнего дня. Это был действительно правильный ответ. Я случайно использовал неправильный ключ API. Спасибо еще раз! - person T. Cole; 17.07.2017