Можно ли настроить ActiveScaffold так, чтобы форма поиска отображалась перед отображением списка?
-
20-08-2019 - |
Вопрос
Когда я прошу ActiveScaffold показать мне очень длинный список (например, список проданных товаров), он запускает запрос к базе данных, чтобы получить первую страницу данных, и отображает ее.Если список имеет несколько связей, выполнение этого запроса может занять некоторое время (более секунды).Большую часть времени меня не интересует этот "нефильтрованный" список:первое, что я хочу сделать, это нажать на "поиск" и отфильтровать этот список.
Есть ли какой-нибудь способ, которым я мог бы сообщить ActiveScaffold не отображать нефильтрованный список при вызове действия list?Я бы хотел, чтобы он просто отображал форму поиска, ждал ввода некоторых критериев и только тогда отобразите отфильтрованный список.
Решение
Я нашел решение, определив условия_для_коллекции метод в контроллере.Это своего рода взлом, но он прост (3 строки) и работает:
def conditions_for_collection
params[:action]=="update_table" ? "" : "1=2"
end
Вот как это происходит:когда вы запрашиваете список, контроллер Список вызывается метод, обрабатываемый ActiveScaffold.Вызовы ActiveScaffold условия_для_коллекции, и поскольку действие является Список (не обновляемая таблица), приведенный выше метод conditions_for_collection возвращает "1=2", что, конечно, приводит к пустому списку.
Пользователь может нажать на кнопку "Поиск" и запустить поиск.Это вызывает обновляемая таблица действие, снова вызовы ActiveScaffold условия_для_коллекции, который на этот раз возвращает "" (без фильтра), поэтому выполняется поиск по всему списку.
Это не совсем красиво, но это делает свое дело.
Другие советы
Вероятно, вам нужно переопределить #index
действуйте и предоставьте свой собственный шаблон.Не похоже, что есть какой-либо способ сказать ему, чтобы он не показывал этот список.
Что- то вроде этого:
active_scaffold :models do |config|
config.actions.exclude :index
end
Затем вам нужно будет реализовать свой собственный индексный метод, который имеет свой собственный шаблон и так далее.Вернитесь к активному поисковому действию Scaffold.Я не уверен, как бы вы это сделали, но если вы посмотрите на исходный HTML-код исходной страницы, которую вы получите обратно, должно быть довольно ясно, на какое действие она ссылается, которое выполняет поиск.