当我要求ActiveScaffold向我显示一个很长的列表(例如销售的产品列表)时,它会运行数据库查询以获取第一页数据并显示它。如果列表有一些关系,则此查询可能需要一些时间才能执行(超过一秒)。大多数时候,我对这个“未经过滤”的列表不感兴趣:我要做的第一件事就是点击“搜索”并过滤掉这个列表。
在调用列表操作时,有什么方法可以告诉ActiveScaffold 不 显示未过滤的列表?我希望它只显示搜索表单,等待输入一些条件,只有然后显示已过滤的列表。
答案 0 :(得分:1)
我通过在控制器中定义 conditions_for_collection 方法找到了解决方案。它有点像黑客,但它很简单(3行)并且有效:
def conditions_for_collection
params[:action]=="update_table" ? "" : "1=2"
end
这是怎么回事:当你要求列表时,调用控制器的 list 方法,由ActiveScaffold处理。 ActiveScaffold调用 conditions_for_collection ,由于操作是 list (不是 update_table ),上面的conditions_for_collection方法返回“1 = 2”,当然这当然导致一个空列表。
用户可以单击“搜索”按钮,然后启动搜索。这会调用 update_table 操作,同样ActiveScaffold调用 conditions_for_collection ,这次返回“”(没有过滤器),因此搜索整个列表。
它不是很漂亮,但它确实起作用。
答案 1 :(得分:0)
您可能需要覆盖#index
操作并提供自己的模板。似乎没有任何方法可以告诉它不显示该列表。
这样的事情:
active_scaffold :models do |config|
config.actions.exclude :index
end
然后,您必须实现自己的索引方法,该索引方法具有自己的模板,依此类推。切换回Active Scaffold的搜索操作。我不确定你是怎么做到这一点的,但是如果你看一下原始页面的HTML源代码,那么你应该很清楚它与搜索链接的动作是什么。