У меня есть приложение для просмотра фильмов, которое выполняет поиск в базе данных API OMDb и заполняет результаты поиска в моем приложении.Я взял эти результаты поиска и перебрал их для создания карточек фильмов для каждого результата.
В этой видеокарте у меня есть кнопка «Добавить фильм в список», которая позволяет пользователю нажать его и добавить в списки, которые уже созданы.Пользователь сможет указать, какой список, а затем добавить его в базу данных.
Я не уверен, как заставить это действие работать.Кто-нибудь может указать мне правильное направление?
Моя страница search.html.erb:
<div class="card-deck text-center" id="card-deck">
<% if @movies %>
<% @movies.each do |m| %>
<div class="card">
<img src= "<%= m["Poster"] %>" alt="No poster found." class="card-img-top">
<div class="card-body">
<h5 class="card-title"><%= m["Title"] %></h5>
<p class="card-text"><%= m["Year"] %></p>
</div>
<div class="card-footer">
<div class="btn-top">
<span class="btn-group">
<%= button_to "Add Movie To List", class: 'btn btn-primary btn-sm btn-space' %>
</span>
</div>
</div>
</div>
<% end %>
<% end %>
</div>
Как бы я перенаправил эту кнопку на определенное действие контроллера, а затем использовал информацию изAPI для создания нового экземпляра фильма, а затем добавить его в список?
Мой поисковый_контроллер.rb:
class SearchesController < ApplicationController
def index
@list = List.all.select(:id, :name)
@movie = Movie.new
end
def omdb
@movie = Movie.new
@list = List.all.select(:id, :name)
conn = Faraday.new(:url => 'http://www.omdbapi.com')
@resp = conn.get do |req|
req.params['apikey'] = ENV['OMDB_API_KEY']
req.params['s'] = params[:movie]
end
body = JSON.parse(@resp.body)
if @resp.success?
@movies = body["Search"]
else
@error = "There was a timeout. Please try again."
end
render 'index'
end
end
Маршруты:
Rails.application.routes.draw do
resources :lists, :movies
get '/search', to: 'searches#index'
post '/search', to: 'searches#omdb'
root 'lists#index'
end
Моя кнопкав моем поиске index.html.erb, чтобы добавить фильм в список, чтобы вызвать модальное всплывающее окно:
<div class="btn-top">
<button class="btn btn-primary btn-sm add-movie" movie-id="m['imdbID']" type="button" data-toggle="modal" data-target="#movielistmodal">Add Movie To List</button>
</div>
И мой код модального тела:
<div class="modal-body">
<%= form_for @movie, method: :post, url: 'add_api_movie_to_list' do |f| %>
<%= hidden_field_tag :movie_id, { id: "movie-id" } %>
<% @list.each do |list| %>
<%= f.label :name, list.name %>
<%= f.radio_button :list_ids, list.id %>
<% end %>
<%= f.submit class: 'btn btn-primary btn-space btn-sm' %>
<% end %>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
Добавить API-фильм в действие контроллера базы данных:
def add_api_movie_to_list
conn = Faraday.new(:url => 'http://www.omdbapi.com')
@resp = conn.get do |req|
req.params['apikey'] = ENV['OMDB_API_KEY']
req.params['i'] = params[:movie_id]
end
body = JSON.parse(@resp.body)
movie_params = { title: body["Title"], genre: body["Genre"], year: body["Year"], poster: body["Poster"], plot: body["Plot"], director: body["Director"] }
movie_params.merge(params[:movie])
@movie = Movie.new(movie_params)
if @movie.save
redirect_to movie_path(@movie)
else
flash[:error] = "Unable to save movie. Try again."
render 'search'
end
end