【问题标题】:Can ActiveScaffold be configured to show the search form before displaying a list?是否可以将 ActiveScaffold 配置为在显示列表之前显示搜索表单?
【发布时间】:2009-01-28 22:55:10
【问题描述】:
当我要求 ActiveScaffold 向我显示一个很长的列表(例如已售产品的列表)时,它会运行数据库查询以获取第一页数据并显示它。如果列表有一些关系,则此查询可能需要一些时间来执行(超过一秒)。大多数时候,我对这个“未过滤”列表不感兴趣:我要做的第一件事就是点击“搜索”并过滤掉这个列表。
有什么方法可以告诉 ActiveScaffold 不 在调用列表操作时显示未过滤的列表?我希望它只显示搜索表单,等待输入一些条件,然后然后显示过滤后的列表。
【问题讨论】:
标签:
ruby-on-rails
configuration
activescaffold
【解决方案1】:
我通过在控制器中定义 conditions_for_collection 方法找到了解决方案。这是一种 hack,但它很简单(3 行)并且有效:
def conditions_for_collection
params[:action]=="update_table" ? "" : "1=2"
end
事情是这样的:当你请求列表时,控制器的 list 方法被调用,由 ActiveScaffold 处理。 ActiveScaffold 调用 conditions_for_collection,由于 action 是 list(不是 update_table),所以上面的 conditions_for_collection 方法返回“1=2”,这当然是导致一个空列表。
用户可以点击“搜索”按钮,启动搜索。这将调用 update_table 操作,ActiveScaffold 再次调用 conditions_for_collection,这一次返回 ""(无过滤器),因此搜索整个列表。
它不是很漂亮,但它确实可以。
【解决方案2】:
您可能需要覆盖#index 操作并提供您自己的模板。似乎没有任何方法可以告诉它不显示该列表。
类似这样的:
active_scaffold :models do |config|
config.actions.exclude :index
end
然后你必须实现你自己的索引方法,它有它自己的模板等等。交回 Active Scaffold 的搜索操作。我不确定你是怎么做到的,但是如果你查看原始页面的 HTML 源代码,你应该很清楚它链接到的操作是什么。