Рельсы, детка, здесь! пытаюсь решить это с помощью 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) - пакетов, которые упрощают добавление функциональности в приложение.