Gdzie umieszczać kod w aplikacji?

Witam wszystkich.
Potrzebuję aby ktoś pomógł naprowadzić mnie na odpowiedni tok działania.

Pracuję aktualnie nad aplikacją do oceniania filmów. Użytkownik będzie posiadał możliwość dodania filmu do bazy na dwa sposoby: wpisać wszystkie informacje samodzielnie, albo pobrać je z The Open Movie Database (www.omdbapi.com). Zrobiłem to w następujący sposób:

views/models/new.html.erb

<div class="col-md-6">
  <% @movie_hash = flash[:info] %>
  <% if @movie_hash.nil? %>
   <% @movie_hash = Hash.new("") %>
  <% end %>
  <%= simple_form_for @movie, html: { class: 'form-horizontal' } do |f| %>
    <%= f.input :title, input_html: {value: @movie_hash["Title"]} %>
    <%= f.input :year, input_html: {value: @movie_hash["Year"]}   %>
    <%= f.input :country, as: :string, input_html: {value: @movie_hash["Country"]}  %>
    <%= f.input :plot, input_html: {value: @movie_hash["Plot"]} %>
    <%= f.button :submit, label: "add new movie" %>
  <% end %>
</div>
<div class="col-md-2">
  <%= form_tag :action => 'get_movie_info' do %>
    <%= text_area :myform, :movie_title %>
    <%= submit_tag "Sarch" %>
  <% end %>
</div>

movies_controller.rb

  def new
    @movie = Movie.new
  end

  def create
    @movie = Movie.new(movie_params).save
    redirect_to root_path
  end

  def get_movie_info
    title_from_form = params['myform']['movie_title']
    url = "http://www.omdbapi.com/?t=#{title_from_form}&y=&plot=short&r=json"
    json_file = open(url) { |f| f.read }
    @movie_info = JSON.parse(json_file)
    redirect_to new_movie_path, :flash => { :info => @movie_info}
  end

Pytania:

  1. Gdzie powinienem umieścić kod, który pobiera informacje o filmie (get_movie_info), to wszystko chyba nie powinno znajdować się w movies_controller?

  2. Czy przekazanie zmiennych z jednej akcji do drugiej za pomocą :flash jest poprawne?

  3. Jakieś wskazówki jak to lepiej zaimplementować?

  1. Kod pobierajacy informacje powinnen sie znalesc w modelu a nie w kontrolerze :slight_smile:

  2. Flash nie sluzy do tego

  3. Z grubsza moja idea

    class Movie
    def self.create_from_omdbapi(title)
    url = “http://www.omdbapi.com/?t=#{title}&y=&plot=short&r=json
    json_file = open(url) { |f| f.read }
    info = JSON.parse(json_file)
    self.create(info)
    end
    end

    def get_movie_info
    title_from_form = params[‘myform’][‘movie_title’]

     if Movie.create_from_omdbapi(title)
         # jesli wszystko OK
     else
      # jesli cos bylo nie tak
     end
    

    end

PS - sorry za formatowanie ale nie umiem tego przeskonczyc :confused:

Dzięki za szybką odpowiedź.

create_from_omdbapi() pobiera informację i od razu zapisuje w bazie danych, tak?
Ja bym chciał dodatkowo dać użytkownikowi możliwość edycji informacji pobranych z omdbapi przed zapisaniem.
Dlatego myślałem nad czymś takim:
pobrać info z omdbapi -> wyświetlić te dane w formularzu -> użytkownik może je edytować przed zapisaniem.

Nie ma potrzeby, by tworzyć dwa formularze. Obok tytułu filmu można dodać link wywoływania akcji kontrolera, której celem jest pobieranie danych z zewnętrznego serwisu. Sama akcja powinna być prosta, a implementacja zawierać delegację do własnego Service Object. Po zwróceniu danych z omdp można wypełnić formularz odpowiednimi danymi, co umożliwi użytkownikowi weryfikację, a w końcu zapisanie danych do bazy.
I jeszcze ważna uwaga: pod żadnym pozorem nie przenosić wywołania zewnętrznego serwisu do modelu.

Szkielet propozycji:

class OmdService
  def call(title)
    # Tutaj wywołanie zewnętrzengo serwisu i zwrócenie danych...
  end
end

class MoviesController
  .
  .
  .
  def get_movie_info
    omd_service = OmdService.new
    info = omd_service.call(params[:title])
    render json: info
  end
end

Pozostaje jeszcze oprogramować formularz w JS (wywołanie akcji kontrolera oraz wypełnianie formularza zwróconymi danymi).

1 Like