Ruby On Rails 学习:Rails3中实现数据分页和排序

来源:互联网 发布:递归算法什么意思 编辑:程序博客网 时间:2024/06/06 00:40

以前在rails2时代使用过will_paginate ( http://blog.csdn.net/kunshan_shenbin/article/details/4182610 ), 

现在打算把它集成进Rails3。另外, 代码中还包括了对JqGrid的集成。

1. 打开Gemfile,修改如下:

gem 'rails', '3.2.13'#gem 'sqlite3'gem 'mysql2'gem 'thin'gem 'will_paginate', '~> 3.0'gem 'jquery-ui-rails'

2. 执行 rails g controller Report index创建名为report的controller。

3. 下载JqGrid库:http://www.trirand.com/blog/ 放置到/app/assets/所对应的文件夹下。

注意:jquery.jqGrid.min.js,以及本地化i18n文件夹应该放到/app/assets/javascripts目录下。

ui.jqgrid.css应该放到/app/assets/stylesheets目录下。

4. 修改:application.js

//= require jquery//= require jquery_ujs//= require jquery.ui.all//= require ./jquery.jqGrid.min.js//= require_tree .

5. 修改:application.css

 *= require_self *= require jquery.ui.all *= require_tree .

6. 修改:report_controller.rb,代码如下:

class ReportController < ApplicationController    helper_method :sort_column, :sort_direction    def index    @data = Model.paginate(:page => params[:page], :per_page => 10).order(sort_column + " " + sort_direction)  end    def get_data    page = params[:page] ? params[:page].to_i : 1    rows = params[:rows].to_i    sidx = params[:sidx]    sord = params[:sord]    count = Model.count    @data = Model.order(sidx + " " + sord).limit(rows).offset((page-1)*rows)    total = (count / rows).ceil       data = @data.collect {|o| {"cell" => {      :id => o.id,       :name => o.name,       :date => o.date,    }}}    result = {"page" => page, "total" => total, "records" => count, "rows" => data }    respond_to do |format|      format.html # index.html.erb      format.json { render json: result }    end  end    private  def sort_column    Model.column_names.include?(params[:sort]) ? params[:sort] : "date"  end    def sort_direction    %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"  end  end

7. 修改:application_helper.rb

module ApplicationHelper    def sortable(column, title = nil)    title ||= column.titleize    css_class = column == sort_column ? "current #{sort_direction}" : nil    direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"    link_to title, {:sort => column, :direction => direction}, {:class => css_class}  end  end

8. 创建所需的model: model.rb (请按实际情况自行创建)

class Model < ActiveRecord::Base  set_table_name "tables"end

9. 创建和修改views文件如下:

a. 修改:index.html.erb

<%= render "model" %><br><table id="list1"></table><div id="pager1"></div><script type="text/javascript">(function() {$("#list1").jqGrid({   url:'report/get_data',datatype: "json",   colNames:['ID', 'Name', 'Date'],   colModel:[   {name:'id',index:'id', width:100},   {name:'name',index:'name', width:100},   {name:'date',index:'date', width:100}   ],   rowNum:20,   autowidth: true,   height:'auto',   rowList:[20,50,100],   pager: jQuery('#pager1'),   sortname: 'id',    viewrecords: true,    sortorder: "desc",    caption:"Model List"}).navGrid('#pager1',{edit:false,add:false,del:false});}).call(this);</script> 

b. 创建:_model.html.erb

<table>  <tr class="pretty">    <th><%= sortable "name", "Name" %></th>    <th><%= sortable "date", "Date" %></th>  </tr><% @data.each do |d| %>  <tr>    <td><%= d.name %></td>    <td><%= d.date %></td>  </tr><% end %></table><br><div class="digg_pagination">  <div class="page_info">    <%= page_entries_info @data %>  </div>  <%= will_paginate @data, :container => false %></div>

10. 修改database.yml(数据库配置)

11. 修改:routes.rb, 追加:get "report/get_data"

12. will_paginate所需样式文件可以从这里下载:http://mislav.uniqpath.com/will_paginate/

然后把pagination.css文件放置到/app/assets/stylesheets目录下。

13. 如果需要排序时提示是升序还是降序,可以从网上找些图片,然后修改report.css.scss文件如下:

.pretty th .current {  padding-right: 12px;  background-repeat: no-repeat;  background-position: right center;}.pretty th .asc {  background-image: url('/assets/up_arrow.gif');}.pretty th .desc {  background-image: url('/assets/down_arrow.gif');}

然后可以启动Thin服务器进行测试。


原创粉丝点击