Ich rufe JSON API aus meiner Rails App. Der Benutzer gibt einen Namen in einem Formular ein. Dann rufe ich JSON API auf und finde heraus, ob der Name irgendwelche Übereinstimmungen hat. Manchmal ist es nur eine so, also erstelle ich Eintrag mit den Daten, die in JSON zur Verfügung gestellt werden. Aber meistens gibt es mehrere Ergebnisse auf dem JSON, wie implementiere ich "Hey, ich habe mehrere Ergebnisse für denselben Namen gefunden, nach welchem suchst du?" und dann wählt der Benutzer aus, welchen er/sie beabsichtigt hat, und dann erstellt er einen Eintrag in der Datenbank.Wie man Bestätigung oder Vorschau in Schienen einführt?
Ich schrieb ein einfaches Skript, um den JSON zu testen.
data = JSON.load response
if data['results'].empty?
#if the JSON data is empty
puts "There was no movie found. Did you spell the movie name correctly?"
elsif data['results'].count > 1
#if JSON Data has more than one result
data['results'].each do |movie|
Movie::Movies << Movie.new(movie['id'],
movie['title'],
movie['release_year'],
(imdb_url + movie['imdb']).to_s,
movie['rating'],
movie['poster_120x171'],
movie['poster_240x342'],
movie['poster_400x570'])
end
Movie::Movies.each do |movie|
puts "#{movie.title} : #{movie.release_year}"
end
else
#IF JSON has only one entry
movie = Movie.new(data['results'][0]['id'],
data['results'][0]['title'],
data['results'][0]['release_year'],
(imdb_url + data['results'][0]['imdb']).to_s,
data['results'][0]['rating'],
data['results'][0]['poster_120x171'],
data['results'][0]['poster_240x342'],
data['results'][0]['poster_400x570'])
end
Und hier ist mein Controller im Moment. Es kann nur den ersten Datensatz aus dem von JSON bereitgestellten Hash verarbeiten. Ich habe keine Ahnung, wie ich mit der Situation umgehen soll, wenn mehrere Ergebnisse vorliegen.
def create
require 'rest_client'
require 'json'
imdb_url = 'http://www.imdb.com/title/'
movie_title = movie_params['title'].delete(' ')
response = RestClient.get "http://api-public.guidebox.com/v1.43/US/xxxxxxxxxxxxxxxx<api-key>/search/movie/title/#{movie_title}"
data = JSON.load response
@movie = Movie.new #i am doing this because my for was giving error.
if data['results'].empty?
flash[:alert] = "Did you spell the Title correctly? Or Maybe we could not find the movie you are looking for."
render 'new'
elsif data['results'].count > 2
#Display all results to the user for them to pick what they really intended and create an entry of whaterver they choose.
else
@movie = Movie.new(gb_id: data['results'][0]['id'],
title: data['results'][0]['title'],
release_year: data['results'][0]['release_year'],
imdb_link: (imdb_url + data['results'][0]['imdb']).to_s,
rating: data['results'][0]['rating'],
small_img: data['results'][0]['poster_120x171'],
med_img: data['results'][0]['poster_240x342'],
large_img: data['results'][0]['poster_400x570'])
if @movie.save
flash[:notice] = 'Movie has been successfully Added.'
redirect_to @movie
else
flash[:alert] = "Something went wrong. Please try again."
render 'new'
end
end
end
Auch in meiner Aktion erstellen Ich hatte die @movie = Movie.new
wieder zu nennen, weil die Form mir Fehler gab.
Dies wird in Bezug auf die Organisation ziemlich unruhig. Verschieben Sie Ihre 'require'-Aufrufe an den Anfang der Datei, diese gehören nicht in eine Methode. Halten Sie den Eindruck konstant und sauber. – tadman
Normalerweise ist das zu verwendende Muster '@ movie.save!' Und dann 'ActiveRecord :: RecordInvalid' zu retten. – tadman