如何在rails中实现确认或预览?
问题描述:
我从我的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
因为形式给我的错误。
答
您近在咫尺 - 允许用户消除结果歧义,执行类似于您在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 %>
这在组织方面变得相当不合理。将'require'调用移动到文件的顶部,这些不属于方法内部。保持缩进恒定和干净。 – tadman
通常使用的模式是@ movie.save!,然后解救ActiveRecord :: RecordInvalid。 – tadman