Сохранить информацию о фильме из API в список в моей базе данных - PullRequest
0 голосов
/ 08 октября 2018

У меня есть приложение для просмотра фильмов, которое выполняет поиск в базе данных 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

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Поскольку фильмы сохраняются в вашей базе данных, вы можете настроить маршрут для настраиваемого действия в ваших фильмах в сочетании с link_to.

Например, если вы определили resources :movies, вы можетесделать что-то вроде этого ->

В routes.rb

resources :movies do
  post '/add_to_list', action: 'add_to_list'
end

В movies_controller.rb ->

def add_to_list
  @movie = Movie.find(params[:movie_id]
  @movie.add_to_list
end

add_to_list может быть определено в вашем Movie модель для того, что вам нужно с ним делать.

Внутри вашего взгляда (search.html.erb) вместо button_to, вы можете использовать link_to, как это ->

<%= link_to 'Add Movie To List', movie_add_to_list_path(m), class: "btn btn-primary btn-sm btn-space", method: :post %>

Это быстрое решение для вашего вопроса: « Как бы я перенаправил эту кнопку на определенное действие контроллера ».

Для этой части -> " Затем используйте информацию изAPI для создания нового экземпляра фильма, а затем добавить его в список?"Я угадаю несколько вещей:

  • У вас есть некоторый объект службы, который выдает запросы к API OMDB черезsome gem
  • Вы сохраняете достаточно информации в своей модели Movie, чтобы можно было выполнить другой запрос к API OMDB, чтобы получить информацию о спецификации.ific movie (этот пользователь будет нажимать в вашем списке)

Если это так, то вы можете создать модель проблемы, которая будет содержать некоторую логику для взаимодействия с объектом службы OMDB

Например, пользовательский метод, который я поставил выше add_to_list, может быть определен для этой проблемы.

Если вам нужна дополнительная информация о том, как это сделать, вы можете связаться со мной.

0 голосов
/ 08 октября 2018

Что нужно сделать, чтобы достичь этой функциональности.

  1. Добавьте модальный загрузчик, который будет содержать список фильмов.
  2. Приведите список movie_lists в переменной как @movie_list в def search, чтобы вы могли получить к нему доступ в поиске.html.erb
  3. Вам нужно будет использовать другой API OMDb, чтобы получить подробную информацию о конкретном фильме, который вы сохраняете в базе данных.
  4. Создание метода, который попадет вконтроллерный метод для добавления фильмов в список.
  5. Некоторые JQuery.

Я предполагаю, что у вас уже есть 2 модели с похожими отношениями:

Class MovieList
  has_many :movies
end

Class Movie
  belongs_to :movie_list
end

вваш movies_controller или любой другой контроллер, в котором вы определили метод def search.

добавьте эту строку.

def search
  #your pre existing code
  #add the following line
  @movie_list = MovieList.all.select(:id, :name)
end

в search.html.erb

добавьте HTML-коддля модальных.в модальное тело добавьте код для формы, в которой вы будете хранить movie_id в скрытом поле и флажки для выбора списка.

<%= form_for :movie, method: :post, url: 'path_of_the_method' do |f| %>
  <%= hidden_field_tag :movie_id, { id: "movie-id" } %>
  <% @movies_list.each do |item| %>
    <%= f.radio_button :movie_list_id, item.id %>
  <% end %>
  <%= f.submit %>
<% end %>

укажите этот маршрут в routs.rb

сейчас

для каждого фильма в результатах поиска есть кнопка, связанная с ним.Давайте переопределим его функциональность.

<%= button_to "Add Movie To List", class: 'btn btn-primary btn-sm btn-space add-movie', 'data-movie-id': m['id'] %>

ПРИМЕЧАНИЕ: Я предполагаю, что вы получаете uniq movie_id за каждый фильм.

JQuery:

для того, чтобы заставить его работать, вы можете определить его в конце search.html.erb

<script>
  $('.add-movie').click(function(e){
    e.preventDefault();
    //Let's assume the id of the Modal (popup) is #list-modal
    $('#movie-id').val($(this).data('movie-id')); //id of the hidden field
    $('#list-modal').modal('show');
  });
</script>

теперь в методе контроллера, который вы только что определили для сохранения значения формы, давайте предположим, что имя метода create_movie илиесли вы используете ресурсы, вы можете напрямую написать create

def create_movie
  #API to fetch details of the movie id you've passed in `params[:movie_id]`
  #movie = API call
  #select the attributes you'll be saving in the database. eg:
  hash_params = { title: movie['title'], name: movie['name'] }
  hash_params.merge(params[:movie])!
  movie = Movie.new(hash_params)
  if movie.save
    #redirect with success message
  else
    #redirect with failure message
  end
end

Я попытался объяснить в лучшем виде.: P Вы можете получить подсказку, что вам нужно сделать.Если вам все еще нужна помощь, просто дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...