【发布时间】:2016-05-13 01:40:41
【问题描述】:
我正在从我的 rails 应用程序调用 JSON api。用户在表单中输入名称,然后我调用 JSON API 并查找该名称是否有任何匹配项。有时它只是一个,所以我使用 JSON 中提供的数据创建条目。但大多数时候 JSON 上有多个结果,我如何实现“嘿,我发现同名的多个结果,你在找哪一个?”然后用户选择他/她想要的,然后在数据库中创建一个条目。
我编写了一个简单的脚本来测试 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 提供的 Hash 中的第一条记录。如果有多个结果,我不知道如何处理这种情况。
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,因为表单给了我错误。
【问题讨论】:
-
这在组织方面变得非常不守规矩。将您的
require调用移至文件顶部,这些调用不属于方法内部。保持缩进不变且干净。 -
通常使用的模式是
@movie.save!,然后是rescueActiveRecord::RecordInvalid。
标签: ruby-on-rails ruby json ruby-on-rails-4