您的位置:首页 > 编程语言 > Ruby

Ruby On Rails框架下的翻页/排序插件

2012-02-27 13:34 323 查看
1. kaminari

官方主页:https://github.com/amatsuda/kaminari

首先在Gemfile文件中加入:gem 'kaminari'

然后通过bundle install命令激活该插件。

演示代码:

home_controller.rb

class HomeController < ApplicationController

def index
@users = User.order(sort).page(params[:page]).per(20)
respond_to do |format|
format.html
format.js
format.xml { render :xml => @users }
end
end

private
def sort
params[:sort].to_s == '' ? "" : params[:sort] + ' ' + params[:direction]
end

end
home_helper.rb

module HomeHelper

def sortable(title = nil, column)
title ||= column.titleize
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, params.merge(:sort => column, :direction => direction), :remote => false, :method => :get
end

private
def sort_column
User.column_names.include?(params[:sort]) ? params[:sort] :  "created"
end

def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "desc"
end

end
index.html.erb

<table>
<tr>
<th><%= sortable 'Email', 'email' %></th>
<th><%= sortable 'Password', 'password' %></th>
<th><%= sortable 'Publisher ID', 'publisher_id' %></th>
</tr>
<% @users.each do |user| %>
<tr>
<td><%= user.email %></td>
<td><%= user.password %></td>
<td><%= user.publisher_id %></td>
</tr>
<% end %>
</table>
<%= paginate @users, :remote => false %>
新建model如下:user.rb

class User < ActiveRecord::Base
end
测试用的数据库中,users表有id, emai, password, publisher_id, created等字段,可自行修改。

注意:

我们可以在通过model中添加paginates_per来设定每页显示的行数,这样在controller里就不需要每次都设定了。

例如:

class User < ActiveRecord::Base

paginates_per 10

end
在controller里直接:@users = User.order(sort).page(params[:page]) 即可。

如果想要使用Ajax,可以参考这里:https://github.com/amatsuda/kaminari_example/tree/ajax

这里简单叙述一下修改步骤:

1. index.html.erb,home_helper.rb等文件中出现:remote => false的全部修改为:remote => true

2. 需要添加几个文件:

index.js.erb

$('#users').html('<%= escape_javascript render(@users) %>');
$('#paginator').html('<%= escape_javascript(paginate(@users, :remote => true).to_s) %>');
在views目录下新建users文件夹,增加_user.html.erb文件:

<tr>
<td><%= user.email %></td>
<td><%= user.password %></td>
<td><%= user.publisher_id %></td>
</tr>
3. 修改文件:

index.html.erb

<table>
<thead>
<tr>
<th><%= sortable 'Email', 'email' %></th>
<th><%= sortable 'Password', 'password' %></th>
<th><%= sortable 'Publisher ID', 'publisher_id' %></th>
</tr>
</thead>
<tbody id="users">
<%= render @users %>
<tbody>
</table>
<%= paginate @users, :remote => true %>
这样翻页的功能就完成了。但是排序还有点问题,因为目前还无法记住上一次排序是按照升序还是降序[可使用session来记录],修改修改home_helper.rb,这里略过。

2. will_paginate

官方主页:https://github.com/mislav/will_paginate/wiki

will_paginate和kaminari非常的相似,这里就简单讲述一下了。

页面 index.html.erb上只需把 <%= paginate @users, :remote => true %> 替换为 <%= will_paginate @users %> 即可。

controller里也只需把

@users = User.order(sort).page(params[:page]).per(10)
替换为:

@users = User.paginate(:page => params[:page], :per_page => 10).order(sort)


其他都可以不更改。

另外,和kaminari一样,我们也可以在model里面定义页面显示的行数:

self.per_page = 10

更多信息可参阅其官方主页。

另外,will_paginate自带很多css可以使用:http://mislav.uniqpath.com/will_paginate/

更多资料:http://railscasts.com/episodes/240-search-sort-paginate-with-ajax?autoplay=true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: