2016-05-13 7 views
0

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.

+0

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

+0

Normalerweise ist das zu verwendende Muster '@ movie.save!' Und dann 'ActiveRecord :: RecordInvalid' zu retten. – tadman

Antwort

0

Sie sind in der Nähe - um dem Benutzer zu erlauben, die Ergebnisse zu disambiguieren, machen Sie etwas ähnliches wie in der else-Klausel, aber in einer Schleife mit einer separaten Aktion.

# controller 
def create 
    #... 
    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 > 1 
    @movie_choices = [] 
    data['results'].each_with_index do |result, idx| 
     @movie_choices << Movie.new(gb_id: data['results'][idx]['id'], 
         title: data['results'][idx]['title'] #, ... 

    end 
    render 'movies/choose_movie' 
    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 

def movie_chosen 
    chosen_movie_gb_id = params[:movie_gb_id] 
    @movie = Movie.new(gb_id: params[:movie_id], 
        title: params[:movie_title], 
        # ... 
        ) 
    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 

# app/views/movies/choose_movie.html.erb 
<%= form_tag 'movies/movie_chosen' do %> 
    <div> 
    <% @movie_choices.each do |mc| %> 
     <div> 
     <%= radio_button_tag :movie_id, mc.gb_id %> <%= mc.title %> 
     <%= hidden_field_tag :movie_title, mc.title %> 
     <!-- ... other fields of the movie object --> 
     </div> 
    <% end %> 
    </div> 
<% end %> 
Verwandte Themen