打印

Rails分页plugin之will_paginate

本帖已经被作者加入个人空间

Rails分页plugin之will_paginate

搜索结果的分页显示是一个常用功能,实现方式有很多中,rails也内建了对分页的支持,但是rails2.0将去掉分页组件,将分页功能交给plugin去实现,这里通过一个简单的例子展示如何使用最流行的rails分页plugin -- will_paginate.

1.创建rails工程及数据库
复制内容到剪贴板
代码:
rails demo
mysql>create database demo_development;
项目名为demo,开发数据库为demo_development
自行修改config/database.yml配置数据库密码,如果root密码为空,则不需要修改

2.生成脚手架和数据
创建一个product的脚手架代码
复制内容到剪贴板
代码:
ruby script\generate scaffold_resource product name:string, description:string,created_at:datetime
运行db/migrate创建数据表
复制内容到剪贴板
代码:
rake db:migrate
构造测试数据
复制内容到剪贴板
代码:
ruby script\console
>>0.upto(30) do |i|
>>  Product.create(:name => "product_#{i}", :description => "product number is #{i}")
>>end
启动服务
复制内容到剪贴板
代码:
ruby script\server
访问http://127.0.0.1:3000/products 就可以看到所有的产品了,模式是全部显示,没有分页.

3.安装will_paginate,编写分页代码
安装:
复制内容到剪贴板
代码:
ruby script\plugin install svn://errtheblog.com/svn/plugins/will_paginate
安装成功后,开始编写分页代码
修改products_controller.rb,找到index方法
复制内容到剪贴板
代码:
    #@products = Product.find(:all)  #把这行注释掉
    @products = Product.paginate  :page => params[:page],
                                  :per_page => 5
保存后刷新http://127.0.0.1:3000/products 可以看到现在只显示前5个产品了
加入翻页,修改app/view/products/index.rhtml,在最后加入一行
复制内容到剪贴板
代码:
<%= will_paginate @products %>
再次刷新页面,可以看到翻页了,试着点击next,previous进行翻页,可以看到url类似http://127.0.0.1:3000/products?page=4

4.加入搜索
在index.rhtml适当位置加入:
复制内容到剪贴板
代码:
<% form_tag products_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
这里注意,:method => 'get'必须指定, submit_tag的:name属性设为nil,避免在url中出现不必要的内容

修改products_controller.rb的index方法
复制内容到剪贴板
代码:
    #@products = Product.find(:all)
    @products = Product.paginate  :page => params[:page],
                                  :per_page => 5,
                                  :conditions => ["name like ?", "%#{params[:search]}%"]
注意在加入搜索条件时的写法,这样可以避免sql注入,提高安全性

试着进行搜索,可以看到搜索结果很好的进行了分页.
def keyword; end

TOP

我 构造测试数据 这步怎么都弄不好,不知道原因?

C:\will_paginate_test>ruby script\about
About your application's environment
Ruby version              1.8.6 (i386-mswin32)
RubyGems version          0.9.4
Rails version             2.0.1
Active Record version     2.0.1
Action Pack version       2.0.1
Active Resource version   2.0.1
Action Mailer version     2.0.1
Active Support version    2.0.1
Application root          C:/will_paginate_test
Environment               development
Database adapter          mysql
Database schema version   1

TOP

问题找到

ruby script\console
>>0.upto(30) do |i|
>>  Product.create(:name => "product_#{i}", :description => "product number is #{i}")
>>end

第三行的 Product.create 我把p小写了,后来打开 app\models\product.rb 文件看代码
class Product < ActiveRecord::Base
end

才知道Product是个类,首字母必须大小

TOP

真是非常感谢。按照做了一遍,完全通过!

TOP