Ruby 中分页功能的实现

需求分析:实现两种分页方式:

1.将从数据库中得到的数据进行筛选,筛选后的数据保存在数组之中,然后将数组中的元素在前台展示出来。举例:学生在选择课程的时候只能选择自己没有选修过的课程,已经选修的不能查看,因此需要将所有的课程从数据库中读出来以后减去已经选修的。

2.将需要的数据从数据库中全部查出来,然后将所有的数据显示出来。举例:学生查看自己所有已经选择的课程,从数据库中查出来以后就可以直接在前台显示了。

第一种情况实现:

第一种情况下rails没有可以直接调用的方法,因此需要自己写。

首先在控制器中将所有的数据进行分页,存在不同的数组中,注意数组的边界。

#------------分页---------------------
    total = @course.count
    params[:total] = total
    if params[:page] == nil
      params[:page] = 1  #进行初始化
    end
    if total % $PageSize == 0
      params[:pageNum] = total / $PageSize
    else
      params[:pageNum] = total / $PageSize + 1
    end

    #计算分页的开始和结束位置
    params[:pageStart] = (params[:page].to_i - 1) * $PageSize

    if params[:pageStart].to_i + $PageSize <= params[:total].to_i
      params[:pageEnd] = params[:pageStart].to_i + $PageSize - 1
    else
      params[:pageEnd] = params[:total].to_i - 1  #最后一页
    end
    #---------------------------------------------------------------------

修改view中的文件:

 <tbody>

            <% (params[:pageStart]..params[:pageEnd]).each do |i| %>
                <tr>
                  <td><%= i+1 %></td>
                  <td><%= @course[i].course_code %></td>
                  <td><%= @course[i].name %></td>
                  <td><%= @course[i].credit %></td>
                  <td><%= @course[i].limit_num %></td>
                  <td><%= @course[i].student_num %></td>
                  <td><%= @course[i].course_type %></td>
                  <td><%= @course[i].teaching_type %></td>
                  <td><%= @course[i].exam_type %></td>
                  <td><%= @course[i].teacher.name %></td>
                  <td><%= link_to "加入课程", select_course_path(@course[i]), class: 'btn-sm btn-info' %></td>

                </tr>
            <% end %>
            </tbody>


<%#----------分页---------%>
          <div id="nav">
            <input type="hidden" name="page" value=<%= params[:page]%>>
            <nav style="text-align: center">
              <ul class="pagination">
                <% if params[:page].to_i == 1%>
                    <li class="disabled"><a>首页</a></li>
                    <li class="disabled"><a>上一页</a></li>
                <% else %>
                    <li><a href=<%= list_courses_path  + '?page=1'%> >首页</a></li>
                    <li><a href=<%= list_courses_path  + '?page='+(params[:page].to_i - 1).to_s %>>上一页</a></li>
                <% end %>
                <li class="disabled"><a>当前为第<%= params[:page] %>页 共<%= params[:pageNum] %>页</a></li>
                <% if params[:page].to_i == params[:pageNum]%>
                    <li class="disabled"><a>下一页</a></li>
                    <li class="disabled"><a>末页</a></li>
                <% else %>
                    <li><a href=<%=  list_courses_path  + '?page=' + (params[:page].to_i + 1).to_s %> >下一页</a></li>
                    <li><a href=<%=  list_courses_path + '?page=' + params[:pageNum].to_s %>>末页</a></li>
                <% end %>
              </ul>
            </nav>
          </div>

第二种情况可以直接调用框架里面的方法。

首先在Gemfile中添加:gem will_paginate,然后在终端内输入 bundle install.

gem 'will_paginate'

修改控制器文件:

@course=current_user.courses.paginate(:page=>params[:page],:per_page=>5)

修改视图文件:

<%= will_paginate @course %>

这样就可以实现每页显示五个,效果如下:


PS:rails框架真是强大啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值