2016-05-13 24 views
0

我从我的Rails应用程序调用JSON API。用户在表单中输入名称,然后我调用JSON API并查找名称是否有任何匹配。有时它只是一个,所以我用JSON提供的数据创建条目。但大多数时候JSON有多个结果,我如何实现“嘿,我发现同一个名称的多个结果,哪一个是你要找的?”然后用户选择他/她想要的哪一个,然后在数据库中创建一个条目。如何在rails中实现确认或预览?

我写了一个简单的脚本来测试JSON。

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 

这里是我目前的控制器。它只能处理JSON提供的哈希中的第一条记录。如果有多个结果,我不知道如何处理这种情况。

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 

也是我创造的行动,我不得不再次调用@movie = Movie.new因为形式给我的错误。

+0

这在组织方面变得相当不合理。将'require'调用移动到文件的顶部,这些不属于方法内部。保持缩进恒定和干净。 – tadman

+0

通常使用的模式是@ movie.save!,然后解救ActiveRecord :: RecordInvalid。 – tadman

回答

0

您近在咫尺 - 允许用户消除结果歧义,执行类似于您在else子句中的操作,但在循环中使用单独的操作。

# 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 %>