Можно ли настроить ActiveScaffold для отображения формы поиска перед отображением списка?

Когда я прошу ActiveScaffold показать мне очень длинный список (например, список проданных товаров), он запускает запрос к базе данных, чтобы получить первую страницу данных, и отображает ее. Если в списке есть несколько отношений, выполнение этого запроса может занять некоторое время (более секунды). В большинстве случаев меня не интересует этот «нефильтрованный» список: первое, что я хочу сделать, это нажать «поиск» и отфильтровать этот список.

Можно ли каким-либо образом запретить ActiveScaffold не отображать нефильтрованный список при вызове действия списка? Я бы хотел, чтобы он просто отображал форму поиска, ждал ввода некоторых критериев и только затем отображал отфильтрованный список.


person MiniQuark    schedule 28.01.2009    source источник


Ответы (2)


Я нашел решение, определив метод conditions_for_collection в контроллере. Это своего рода хак, но он простой (3 строки) и работает:

def conditions_for_collection
  params[:action]=="update_table" ? "" : "1=2"
end

Вот как это происходит: когда вы запрашиваете список, вызывается метод контроллера list, который обрабатывается ActiveScaffold. ActiveScaffold вызывает conditions_for_collection, и, поскольку действием является список (а не update_table), приведенный выше методconditions_for_collection возвращает «1=2», что, конечно же, приводит к пустому списку.

Пользователь может нажать на кнопку «Поиск» и запустить поиск. Это вызывает действие update_table, снова ActiveScaffold вызывает conditions_for_collection, которое на этот раз возвращает "" (без фильтра), поэтому выполняется поиск по всему списку.

Это не очень красиво, но это делает работу.

person MiniQuark    schedule 30.01.2009

Вероятно, вам нужно переопределить действие #index и предоставить собственный шаблон. Не похоже, что есть какой-либо способ сказать, чтобы он не отображал этот список.

Что-то вроде этого:

active_scaffold :models do |config|
    config.actions.exclude :index
end

Затем вам нужно будет реализовать свой собственный метод индекса, который имеет собственный шаблон и так далее. Вернитесь к поисковому действию Active Scaffold. Я не уверен, как вы это сделали, но если вы посмотрите на исходный HTML-код исходной страницы, которую вы вернете, должно быть довольно ясно, какое действие, на которое он ссылается, выполняет поиск.

person Otto    schedule 29.01.2009