如何将分页方法与模型方法相结合



在我的控制器中,我设置了以下

控制器

if params[:search]
  @beers = Beer.search(params[:search]).order("created_at DESC")
else
  @beers = Beer.paginate(page: params[:page])
end

型号

Beer.search来自我的模型,该模型具有此方法定义的

def self.search(search)
  where("name LIKE ?", "%#{search}%")
end

查看

最后,在我看来,我有这个代码

<%= will_paginate %>
<ul class="beers">
  <%= render @beers %>      
</ul>
<%= will_paginate %>

所以我使用分页,但我得到的错误是"未定义的方法`total_pages'"

经过研究,这个错误来自于没有设置页面限制,而params [:search]if语句中没有这样做。有没有一种方法可以保持我当前的设置,但也包括一个分页部分?

只需为这些查询是否分页设置一个标志。

if params[:search]
    @beers = Beer.search(params[:search]).order("created_at DESC")
else
    @beers = Beer.paginate(page: params[:page])
    @paginated = true
end

然后检查是否设置了该标志。

<% if @paginated %>
  <%= will_paginate %>
<% end %>
<ul class="beers">
  <%= render @beers %>
</ul>
<% if @paginated %>
  <%= will_paginate %>
<% end %>

或者也对搜索结果进行分页@beers = Beer.search(params[:search]).order("created_at DESC").paginate(page: params[:page])

您可以这样做:

if params[:search]
  @beers = Beer.search(params[:search]).paginate(page: params[:page]).order("created_at DESC")
else
  @beers = Beer.paginate(page: params[:page])
end

要重构代码,请执行以下操作:

控制器

@beers = Beer.search(params[:search]).paginate(page: params[:page]).order("created_at DESC")

型号

def self.search(search = nil)
  if search.present?
    where("name LIKE ?", "%#{search}%")
  else
    all
  end
end

我希望这对你有帮助。