[Rails 常用插件简介]ajax_paginate

这个并不是一个完整的插件,仅供娱乐:)

其实这也是个简单的插件制作过程,本插件依赖will_paginate

一:新建Project
[code]
rails ajax_paginate_demo
[/code]

地球人都知道这个是干嘛的,不说了

二:安装will_paginate插件
[url]http://mmm.iteye.com/blog/116931[/url]


三:制作我们的ajax_paginate插件
[code]
ruby script/generate plugin ajax_paginate
[/code]

并且在lib下新建ajax_paginate目录,目录如下图
[img]http://mmm.iteye.com/upload/picture/pic/5111/b20284de-c2a4-47ab-9005-8baaf672c1a4.gif[/img]

修改init.rb

[code]
require 'ajax_paginate/view_helpers'

ActionView::Base.send :include, AjaxPaginate::ViewHelpers
[/code]

如果你看过插件的源码,那么这个就不用说了。(就是让View中可以直接使用我们的AjaxPaginate::ViewHelpers中的方法)

will_paginate默认已经实现了分页的功能,我们要做的仅仅是增加ajax显示的效果,AjaxPaginate::ViewHelpers 从WillPaginate::ViewHelpers copy 过来的,
首先修改原来的will_paginate,我们从新命名为ajax_paginate

稍作修改
[code]
def ajax_paginate(entries = @entries, options = {})
total_pages = entries.page_count

if total_pages > 1
#保持原有的WillPaginate的options参数
options = WillPaginate::ViewHelpers.pagination_options.merge options.symbolize_keys
#....
#修改为remote_page_link_or_span,下同
links << remote_page_link_or_span((n != page ? n : nil), 'current', n, param)

#...............
# next and previous buttons
links.unshift remote_page_link_or_span(entries.previous_page, 'disabled', options.delete(:prev_label), param)
links.push remote_page_link_or_span(entries.next_page, 'disabled', options.delete(:next_label), param)
#...............
end
end
[/code]


增加remote_page_link_or_span

[code]
def remote_page_link_or_span(page, span_class, text, param)
unless page
content_tag :span, text, :class => span_class
else
# page links should preserve GET parameters, so we merge params
link_to_remote text, :url=>params.merge(param.to_sym => (page !=1 ? page : nil)), :method=>:get, :update=>''
end
end
[/code]

[color=Red]注
update为什么写死在这里,因为我偷懒,你可以跟WillPaginate::ViewHelpers一样做成options,这个最后再讨论[/color]

OK,可以使用了:)
在View中直接使用
[code]
<%=ajax_paginate @users%>
[/code]

即可看到效果了.

================================== 华丽的分割线=================================================
来个简单的应用来演示我们的插件是否生效,刚才我们已经新建了ajax_paginate_demo项目
1:修改database.yml
[code]
development:
adapter: mysql
database: ajax_paginate_demo
username: root
password:
host: localhost
[/code]

2:建立数据库
[code]
create database ajax_paginate_demo
[/code]

3:创建例子中的model,我们选用User
[code]
ruby script\generate scaffold_resource user name:string
[/code]

仅仅包括一个字段,将附件中的001_create_users.rb覆盖你的数据,执行
[code]
rake db:migrate
[/code]

将会导入千八条的数据(这些数据来源于互联网,我随手检索了Authors List 发现这个网页的,我只是整理了下,做测试数据:[url]http://www.classicreader.com/allauthor.htm[/url] )

4:修改users_controller.rb
[code]
class UsersController < ApplicationController
# GET /users
# GET /users.xml
def index
@users = User.paginate :all, :page=>params[:page]||1
respond_to do |format|
format.html do
unless params[:page].nil?
render :update do |page|
page.replace_html :page, :partial=>'list'
end
end
end
format.xml do
render :xml => @users.to_xml
end
end
end
end
[/code]

注意:
[color=Red]我们这里指定了更新的div id为 page,你可以将这个参数一并加到我们的更一步考虑中[/color]

5:修改index.html
[code]
<h1>Listing users</h1>
<div id="spinner_div" style="float:right">
<%= image_tag 'spinner.gif', :id => 'spinner', :style => 'display: none' %>
</div>
<div id="page">
<%=render :partial=>'list'%>
</div>
[/code]

新增_list.rhtml
[code]
<table>
<tr>
<th>Name</th>
</tr>

<% for user in @users %>
<tr>
<td><%=h user.name %></td>
</tr>
<% end %>
</table>
<%=ajax_paginate @users%>
[/code]

6:Ajax需要导入js,修改/app/views/layouts/users.rhtml导入js
[code]
<%= javascript_include_tag :defaults%>
[/code]

7:增加点ajax的经典效果
修改remote_page_link_or_span 使之一直有效 (俺偷懒,这个一并和上面的update加入更进一步考虑中实现之)
[code]
link_to_remote text, :url=>params.merge(param.to_sym => (page !=1 ? page : nil)), :method=>:get, :update=>'', :before => %(Element.show('spinner')), :success => %(Element.hide('spinner'))
[/code]

8:
还有什么呢?
........

没了,真的没了,测试一下看看结果如何:)满意不?


任务还没完成,同志尚需努力!
================================== 华丽的分割线=================================================
更进一步讨论:
1:增加更多的可选参数,让他真正同link_to_remote一样,我们看下rails源码中的AJAX_OPTIONS
[code]
CALLBACKS = Set.new([ :uninitialized, :loading, :loaded, :interactive, :complete, :failure, :success ] + (100..599).to_a)
AJAX_OPTIONS = Set.new([ :before, :after, :condition, :url, :asynchronous, :method, :insertion, :position, :form, :with, :update, :script ]).merge(CALLBACKS)
[/code]


代码见这里
http://ajaxpaginate.googlecode.com/svn/trunk/ajax_paginate/

演示代码见这里:
http://ajaxpaginate.googlecode.com/svn/trunk/ajax_paginate_demo/

你可以使用svn checkout。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值