1

当我让 ActiveScaffold 向我展示一个很长的列表(例如已售产品列表)时,它会运行数据库查询以获取第一页数据并显示它。如果列表有一些关系,则此查询可能需要一些时间来执行(超过一秒)。大多数时候,我对这个“未过滤”列表不感兴趣:我想做的第一件事就是点击“搜索”并过滤掉这个列表。

有什么方法可以告诉 ActiveScaffold在调用列表操作时不要显示未过滤的列表?我希望它简单地显示搜索表单,等待输入一些条件,然后才显示过滤列表。

4

2 回答 2

1

我通过在控制器中定义conditions_for_collection方法找到了解决方案。这是一种 hack,但它很简单(3 行)并且有效:

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

事情是这样的:当你请求列表时,控制器的列表方法被调用,由 ActiveScaffold 处理。ActiveScaffold 调用conditions_for_collection,由于操作是列表(不是update_table),所以上面的 conditions_for_collection 方法返回“1=2”,这当然会导致一个空列表。

用户可以单击“搜索”按钮,并启动搜索。这将调用update_table操作,ActiveScaffold 再次调用conditions_for_collection,这一次返回 "" (无过滤器),因此搜索整个列表。

它不是很漂亮,但它确实有效。

于 2009-01-30T10:38:23.897 回答
0

您可能需要覆盖该#index操作并提供您自己的模板。似乎没有任何方法可以告诉它不显示该列表。

像这样的东西:

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

然后,您必须实现自己的索引方法,该方法具有自己的模板等。交回 Active Scaffold 的搜索操作。我不知道你是怎么做到的,但是如果你查看原始页面的 HTML 源代码,你应该很清楚它链接到的搜索操作是什么。

于 2009-01-29T20:01:52.230 回答