Light mode only

Introdução

Recentemente, desenvolvi um sistema de reservas de voos utilizando Ruby on Rails, onde os usuários podem pesquisar voos, selecionar o voo desejado e inserir suas informações pessoais para concluir a reserva. Este post tem como objetivo compartilhar os detalhes do desenvolvimento dessa aplicação.

Funcionalidades da Aplicação

1. Pesquisa de Voos

Na tela de pesquisa, o usuário pode selecionar o aeroporto de partida, aeroporto de chegada, data do voo e o número de passageiros. As opções de aeroportos são carregadas dinamicamente a partir do banco de dados, e o menu suspenso de datas mostra apenas os dias com voos disponíveis.

class FlightsController < ApplicationController
  def index
    @airports = Airport.all
    @dates = Flight.pluck(:start_datetime).map { |d| d.to_date }.uniq
    @flights = []

    if params[:departure_airport_id].present? && params[:arrival_airport_id].present? && params[:date].present?
      @flights = Flight.where(
        departure_airport_id: params[:departure_airport_id],
        arrival_airport_id: params[:arrival_airport_id],
        start_datetime: params[:date].to_date.all_day
      )
    end
  end
end

2. Escolha do Voo

Após a pesquisa, os voos disponíveis são apresentados ao usuário, que pode selecionar o voo desejado. O formulário de seleção inclui os detalhes do voo, como horário de partida, chegada e duração.

<%= form_with url: new_booking_path, method: :get, local: true do %>
  <table>
    <thead>
      <tr>
        <th></th>
        <th>Aeroporto de Partida</th>
        <th>Aeroporto de Chegada</th>
        <th>Data e Hora</th>
        <th>Duração</th>
      </tr>
    </thead>
    <tbody>
      <% @flights.each do |flight| %>
        <tr>
          <td><%= radio_button_tag :flight_id, flight.id %></td>
          <td><%= flight.departure_airport.code %></td>
          <td><%= flight.arrival_airport.code %></td>
          <td><%= flight.start_datetime %></td>
          <td><%= flight.duration %> minutos</td>
        </tr>
      <% end %>
    </tbody>
  </table>
  <%= hidden_field_tag :passengers, params[:passengers] %>
  <%= submit_tag "Escolher Voo" %>
<% end %>

3. Captura das Informações dos Passageiros

Após selecionar o voo, o usuário insere as informações pessoais de cada passageiro. Cada passageiro recebe um campo de nome e e-mail, e as informações são enviadas para criar a reserva.

class BookingsController < ApplicationController
  def new
    @flight = Flight.find(params[:flight_id])
    @booking = Booking.new(flight: @flight, passengers_count: params[:passengers])
    params[:passengers].to_i.times { @booking.passengers.build }
  end

  def create
    @booking = Booking.new(booking_params)
    if @booking.save
      redirect_to @booking, notice: 'Reserva criada com sucesso!'
    else
      render :new
    end
  end

  private

  def booking_params
    params.require(:booking).permit(:flight_id, :passengers_count, passengers_attributes: [:name, :email])
  end
end

4. Exibição da Reserva

Após o envio do formulário, a página de confirmação exibe as informações do voo e dos passageiros. O sistema associa automaticamente os passageiros à reserva e ao voo escolhido.

<h1>Reserva Confirmada</h1>
<p><strong>Aeroporto de Partida:</strong> <%= @booking.flight.departure_airport.code %></p>
<p><strong>Aeroporto de Chegada:</strong> <%= @booking.flight.arrival_airport.code %></p>
<p><strong>Data e Hora:</strong> <%= @booking.flight.start_datetime %></p>
<p><strong>Duração:</strong> <%= @booking.flight.duration %> minutos</p>

<h2>Passageiros</h2>
<ul>
  <% @booking.passengers.each do |passenger| %>
    <li>
      <p><strong>Nome:</strong> <%= passenger.name %></p>
      <p><strong>Email:</strong> <%= passenger.email %></p>
    </li>
  <% end %>
</ul>

Tecnologias Utilizadas

  • Ruby on Rails: Utilizado para construir o backend da aplicação, com ActiveRecord para gerenciar as associações entre voos, reservas e passageiros.
  • HTML e ERB: Para construir as páginas de visualização com os formulários e exibir os dados.
  • PostgreSQL: Banco de dados para armazenar os voos, reservas e informações dos passageiros.

Desafios e Aprendizado

Durante o desenvolvimento, o principal desafio foi lidar com os parâmetros aninhados para criar múltiplos passageiros a partir de um único formulário de reserva. A solução envolveu o uso do método accepts_nested_attributes_for no modelo Booking para lidar com a criação em massa de passageiros.

Conclusão

Este projeto me permitiu aprofundar meus conhecimentos em associações de modelos no Rails, uso de atributos aninhados e manipulação de formulários dinâmicos. Além disso, pude reforçar o uso de boas práticas no desenvolvimento web.confira o codigo completo