关于使用明确的“每页”限制的will_paginate - Rails 4.2.0

时间:2016-07-16 12:54:30

标签: ruby-on-rails

例如,我有一个Post模型,我将按照以下方式达到每页限制10个;

Post.paginate(:page => params[:page], :per_page => 10)

但我的问题是,我如何随机限制页面。

例如,对于第一页我要显示10条记录,而在第二页我要显示15条记录,依此类推。

我如何在我的rails应用程序中实现它。

posts_controller.rb

    class PostsController < ApplicationController
      before_action :set_post, only: [:show, :edit, :update, :destroy]

      # GET /posts
      # GET /posts.json
      def index
    @posts = Post.paginate(page: params[:page])
    dynamic_paging = {"1" => 10, "2"=> 15, "3"=> 20, "4"=>25 }
    per_page_after_four = 30
    params[:page] = params[:page] || 1
    if params[:page] < 5
      @posts = Post.paginate(:page => params[:page], :per_page => dynamic_paging[params[:page]])
    else
      @posts = Post.paginate(:page => params[:page], :per_page => per_page_after_four)
    end
  end

index.html.erb

<center><%= will_paginate @posts %></center>

欢迎任何建议。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

通过使用以下代码,您可以实现此目的,但您需要确定限制,例如,在第4页之后,所有页面都应包含per_page 30.

dynamic_paging = {"1" => 10, "2"=> 15, "3"=> 20, "4"=>25 }
per_page_after_four = 30
params[:page] = params[:page] || 1
if params[:page] < 5
  @posts = Post.paginate(:page => params[:page], :per_page => dynamic_paging[params[:page]])
else
  @posts = Post.paginate(:page => params[:page], :per_page => per_page_after_four)
end

更新

如果您想从视图中设置per_page,那么这是更新后的解决方案。

在视图上使用select。

<%= select_tag :per_page, options_for_select([10,15,20,25], params[:per_page].to_i),
   :onchange => "if(this.value){window.location='?per_page='+this.value;}" %>

并在控制器中。

@per_page = params[:per_page] || Post.per_page || 20
@posts = Post.paginate( :per_page => @per_page, :page => params[:page])

希望这会有所帮助!

答案 1 :(得分:0)

修改索引视图如下;

def index
   dynamic_paging = {"1" => 10, "2"=> 15, "3"=> 20, "4"=>25 }
    params[:page] = params[:page] || 1
    if params[:page].to_i < 5
      @posts = Post.paginate(:page => params[:page], :per_page => dynamic_paging[params[:page].to_s])
   end
  end