2017-09-04 6 views
-1

Ich habe ein Problem, wenn ich versuche, Rails db: Seed im Terminal ausführen. Es gibt mir die folgende Fehlermeldung:NoMethodError: undefinierte Methode `[] 'für Nil: NilClass

NoMethodError : undefined method `[]' for nil:NilClass

Können Sie mir bitte helfen? Ich habe mehrere Dinge ausprobiert, aber bisher kein Glück.

(1..50).each do |movie| 
    response = HTTParty.get("https://api.themoviedb.org/3/movie/popular?api_key=8d027704c57524153a0af2b38415ac45&language=en-US&page=1") 
    results = JSON.parse(response.body) 

    movie = Movie.new({ 
    title: results["title"], 
    popularity: results[0]["popularity"], 
    image: results["poster_path"], 
    year: results[0]["release_date"], 
    genre: results[0]["genre_ids"] 
    }) 

    movie.save 
    puts "#{movie['title']} was saved." 
    end 

Mein Schema sieht wie folgt aus:

create_table "movies", force: :cascade do |t| 
    t.string "title" 
    t.string "image" 
    t.string "year" 
    t.string "genre" 
    t.string "rating" 
    t.string "popularity" 
    t.string "video" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

Dank für Ihre Hilfe danken.

+1

_ „Ich habe versucht, einige Dinge“ _ - das erste, was ich tun würde, ist Start 'irb' (oder' Schienen console') und führen Sie den Code Zeile für Zeile (oder Ausdruck durch Ausdruck). Es würde zeigen, dass 'Ergebnisse [" title "]' und 'results [0]' beide "nil" zurückgeben. – Stefan

Antwort

1

JSON hat Struktur:

{ 
    "page": 1, 
    "total_pages": 978, 
    "total_results": 19552, 
    "results": [..] 
} 

ändern

results = JSON.parse(response.body) 

Um

results = JSON.parse(response.body)['results'] 

Ihr Code auch an anderen Stellen gebrochen. Hier ist mein Vorschlag:

res = HTTParty.get('https://api.themoviedb.org/3/movie/popular?api_key=8d027704c57524153a0af2b38415ac45&language=en-US&page=1') 
results = JSON.parse(res.body)['results'] 

results.each do |result| 
    movie = Movie.create({ 
    title: result['title'], 
    popularity: result['popularity'], 
    image: result['poster_path'], 
    year: result['release_date'], 
    genre: result['genre_ids'] 
    }) 

    puts "#{movie.title} was saved." 
end 
+0

Vielen Dank für Ihre Antwort, also wenn ich es änderte, gibt es mir jetzt den folgenden Fehler: TypeError: keine implizite Umwandlung von String in Integer – Em774

+0

ok, Hinzufügen der [0] funktioniert, danke. So hat es meine Liste der Top 50 Filme gesetzt, aber ich bin nicht sicher, warum es den gleichen Titel 50 mal druckt. Gibt es etwas mit dieser Zeile? Puts "# {movie ['title']} wurde gespeichert." ? – Em774

+0

gut, wenn ich sie entfernen, dann bekomme ich einen Fehler. Ich bin nicht sicher, wie es dann funktioniert, weil ich dachte, dass die Funktion jeder: (1..50) .jede | Film | sollte mir Infos für jeweils 50 Filme geben. – Em774

Verwandte Themen