2017-07-16 2 views
0

Il s'agit manifestement d'une erreur courante. Cependant, je suis incapable de résoudre ce problème en passant en revue mon code. J'essaie d'accéder à l'API de ProPublica pour le congrès. Mon modèle, ma vue et mon contrôleur sont assez simples et ce code exact a fonctionné avec moi lors de l'accès à l'API Google Actualités.Méthode non définie `each 'pour Nil: NilClass lors de l'utilisation de l'API dans Rails

Je continue d'obtenir une erreur de méthode non définie lorsque j'essaie d'utiliser la méthode ".each" dans ma vue pour parcourir la réponse JSON. Je crois que je passe les en-têtes appropriés à l'API comme il le demande.

Mes modèles:

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 

Mon contrôleur:

class BillsController < ApplicationController 
    def index 
    @response = CongressTracker.response 
    end 
end 

Mon point de vue:

<% @response["results"].each do |bill| %> 
 
     <p><%= bill["title"]%></p> 
 
     <p><%= bill["summary"]%></p> 
 
    <% end %>

Mon itinéraire:

resources :bills 

L'erreur en détail:

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' 

Exemple de réponse JSON attendu (que je peux aller travailler dans le terminal):

{ 
    "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": "", 
       }, 
+0

Quel est le contenu de '@ response', avez-vous pas l'analyser? –

+0

Je crois que HTTParty a sa propre façon d'analyser JSON. Ce code exact fonctionne avec l'API Google Actualités que j'utilise également, donc je ne pense pas que ce soit un problème d'analyse de la réponse JSON. –

+0

Une chose que vous pouvez essayer est de lancer un '<% = debug @response%>' dans la vue et de vérifier la structure de réponse et à partir de là si elle est éteinte, vous pourrez peut-être savoir ce qui a changé ou pourquoi Re attente à partir de là –

Répondre

1

La raison pour laquelle vous obtenez le undefined method 'each' for nil:NilClass erreur, est la plus probable parce que la réponse est {"message"=>"Forbidden"}, car votre clé API est incorrecte.

J'ai testé votre code, et tout fonctionne correctement tant que vous avez la bonne clé API.

Vous avez quelques erreurs avec votre vue, très probablement parce que vous n'avez pas encore les résultats.

Pour obtenir le titre et le résumé des factures que vous aurez besoin de quelque chose comme ceci:

<% @response["results"].each do |result| %> 
    <% result["bills"].each do |bill| %> 
    <p><%= bill["title"]%></p> 
    <p><%= bill["summary"]%></p> 
    <% end %> 
<% end %> 
+0

Je vais vérifier ma clé et modifier ma vue. Je vous remercie! Cela m'a été donné une pause pendant des heures. –

+0

J'ai marqué cela comme la réponse hier, mais n'a pas eu l'occasion de tester et de s'assurer jusqu'à aujourd'hui. C'était en effet la bonne réponse. J'ai accidentellement utilisé la mauvaise clé API. Merci encore! –