Rails 3 +延迟加载+ Kaminari用于分页+ HAML

时间:2011-04-12 21:36:55

标签: ruby-on-rails pagination haml lazy-evaluation kaminari

我想使用kaminari gem对搜索结果进行分页。由于gem不会“污染”ActiveRecord :: Base和Array,因此kaminari实际上是我首选的方式(从架构的角度来看)。不幸的是,有Rails 3和它的延迟加载概念使事情有点令人困惑(至少在我的场景中)。

在我的HAML-Template中,我想列出我的所有搜索结果。当结果集为空时,我想显示一条消息,告诉用户没有找到结果。在过去,我可以做以下事情:

- unless @results.empty?
  ... search results ...
- else
  ... no results found ...

= paginate @results

自.empty?不强制加载这显然不再适用于Rails 3. Jep,我可以在我的Query中使用.all来强制加载。不幸的是.all返回一个数组和kaminari的paginate View帮助程序不适用于Arrays(正确的哲学imho)。我很好奇你将如何处理这种情况。任何最佳做法?我的所有尝试都以丑陋的结构结束(如下图所示)。 :/

让事情变得更加清晰:

我的控制器操作:

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。

任何想法?

提前致谢!

1 个答案:

答案 0 :(得分:1)

适合我:

- if @applications.present?
  %ul
    - @applications.each do |application|
      %li= application.name
  %p= paginate @applications
- else
  %p No results found ...

kaminari(0.12.3)