我想使用 kaminari gem 对搜索结果进行分页。由于 gem 不会“污染” ActiveRecord::Base 和 Array,因此 kaminari 实际上是我首选的方式(从架构的角度来看)。不幸的是,Rails 3 和它的延迟加载概念让事情变得有点混乱(至少在我的场景中)。
在我的 HAML 模板中,我想列出我所有的搜索结果。当结果集为空时,我想显示一条消息,告诉用户未找到任何结果。在过去,我可以执行以下操作:
- unless @results.empty?
... search results ...
- else
... no results found ...
= paginate @results
由于 .empty? 不强制加载这显然不再适用于 Rails 3。Jep,我可以在我的查询中使用 .all 来强制加载。不幸的是 .all 返回一个数组,而 kaminari 的分页视图助手不适用于数组(正确的哲学恕我直言)。我很好奇你会如何处理这种情况。有什么最佳实践吗?我所有的尝试都以丑陋的结构告终(如下图所示)。:/
为了让事情更清楚一点:
我的控制器动作:
helper_method :keys
def groups
@results = []
if params[:query].present?
@results = Group.public
.where({:body.matches_any => keys} | {:subject.matches_any => keys})
.order('groups.updated_at DESC')
.page(params[:page])
.per(1)
end
respond_to do |format|
format.html
end
end
我的“丑陋” HAML 模板:
%h1= "Search results for \"#{params[:query]}\""
%br
%ol
- @results.each do |group|
%li
= link_to group.subject, group
%br
= group.body
%br
= group.created_at
- if @results.empty?
%div No results found ...
- else
=paginate(@results)
这里的问题:虽然没有找到结果,但它创建了一个 ol-tag。
有任何想法吗?
提前致谢!