Как мне убедиться, что я загружаю только рейсы при поиске, а не загрузку начальной страницы?

Рельсы, детка, здесь! пытаюсь решить это с помощью Rails 7. У меня есть небольшое игрушечное приложение, которое пытается найти рейсы, а затем предлагает пользователям забронировать рейс. Мне удалось объединить приложение до такой степени, что оно показывает рейсы и можно выполнить успешный поиск. Моя проблема заключается в начальной загрузке страницы, страница заполняется потоком, который я собираюсь получить только после того, как человек выполнил поиск. Затем можно выполнить поиск конкретных рейсов, но такое поведение является ошибкой, которую я хочу исправить.

Итак, вот что я попробовал. Сначала я думал о том, чтобы отделить индекс от методов действия поиска, инициализировать @flights пустым массивом, а затем выполнить операцию поиска, где @flights будет заполняться из лямбды filter_flights с ограниченной областью действия в модели полета. это работает только в том случае, если индекс не загружается со всеми рейсами, но когда вы затем пытаетесь выполнить запрос, хэш параметров пуст и запрос не генерируется (надеюсь, я понимаю). Короче говоря, никакой поиск фактически не проводится. Я думал, что проблема в моих путях, и сделал столько же объявлений, указав метод действия поиска в контроллерах, но безрезультатно. Как я могу решить эту проблему, это мой пример кода:

Модель полета:

class Flight < ApplicationRecord
  belongs_to :departure_airport, class_name: 'Airport'
  belongs_to :arrival_airport, class_name: 'Airport'

  validates :departure_airport, :arrival_airport, :flight_date, presence: true

  scope :filter_flights, lambda { |departure_airport, arrival_airport, date, passengers|
    flights = all
    if departure_airport.present?
      flights = flights.joins(:departure_airport).where('flights.departure_airport_id = ?', departure_airport)
    end
    if arrival_airport.present?
      flights = flights.joins(:arrival_airport).where('flights.arrival_airport_id = ?', arrival_airport)
    end
    flights = flights.where('flight_date = ?', date) if date.present?
    flights.where('available_passenger_seats >= ?', passengers) if passengers.present?
  }
end

Контроллер:

class FlightController < ApplicationController
  def index
    @flight_dates = Flight.select(:flight_date).distinct.order(:flight_date)

    # @flights = Flight.includes(:departure_airport, :arrival_airport).order(:flight_date)

    @flights = Flight.filter_flights(params[:departure_airport_id],
                                     params[:arrival_airport_id],
                                     params[:flight_date],
                                     params[:number_of_passengers])
  end
end

и это глава моей формы:

<%= form_with model: @flight ,url: '/', method: :get do |form| %>

Чтобы убедиться, что я получаю то, что ищу, я сначала проверял, если @flights.present?, а затем соответствующим образом отображал рейсы.

Надеюсь, это прояснило мою проблему, и я смогу получить помощь. Я учусь.

Сначала я думал о том, чтобы отделить индекс от методов действия поиска, инициализировать @flights пустым массивом, а затем выполнить операцию поиска, где @flights будет заполняться из лямбды filter_flights с областью действия в модели полета. это работает только в том случае, если индекс не загружается со всеми рейсами, но когда вы затем пытаетесь выполнить запрос, хэш параметров пуст и запрос не генерируется (надеюсь, я понимаю). Короче говоря, никакой поиск фактически не проводится. Я думал, что проблема в моих путях, и сделал столько же объявлений, указав метод действия поиска в контроллерах, но безрезультатно.

🤔 А знаете ли вы, что...
Rails использует множество гемов (gems) - пакетов, которые упрощают добавление функциональности в приложение.


64
1

Ответ:

Решено

В индекс добавляйте рейсы в @flights только тогда, когда в params что-то есть, в противном случае установите его как пустое.