如何将分页方法与模型方法结合使用?

时间:2015-11-27 01:09:06

标签: ruby-on-rails ruby

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

控制器

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 %>

所以我使用的是paginate,但我得到的错误是“未定义的方法`total_pages'”

进行研究后,此错误来自未设置页面限制,而在params [:search] if语句中未执行此操作。有没有办法保持我当前的设置,但也包括一个分页部分?

2 个答案:

答案 0 :(得分:1)

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

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])

答案 1 :(得分:0)

你可以这样做:

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

我希望这对你有所帮助。