Ruby 中分页功能的实现

来源:互联网 发布:新浪微博域名是什么 编辑:程序博客网 时间:2024/05/29 13:21

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

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框架真是强大啊

0 0
原创粉丝点击