Agile Web Development with Rails, Edition 4

Agile Web Development with Rails, Edition 4

12.4 Playtime 12.2 Iteration G2: Atom Feeds

12.3 Iteration G3: Pagination

Add in the will_paginate gem

edit Gemfile
# source 'http://rubygems.org'
 
gem 'rails', :path => "/home/rubys/git/rails" # '3.0.10'
 
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
 
gem 'sqlite3'
 
# Use unicorn as the web server
# gem 'unicorn'
 
# Deploy with Capistrano
# gem 'capistrano'
 
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19', :require => 'ruby-debug'
 
# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
# gem 'sqlite3-ruby', :require => 'sqlite3'
# gem 'aws-s3', :require => 'aws/s3'
 
# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
# group :development, :test do
#   gem 'webrat'
# end
 
gem 'will_paginate', '~> 3.0'

Restart the server.

bundle show
Gems included by the bundle:
  * abstract (1.0.0)
  * actionmailer (3.0.10)
  * actionpack (3.0.10)
  * activemodel (3.0.10)
  * activerecord (3.0.10)
  * activeresource (3.0.10)
  * activesupport (3.0.10)
  * arel (2.0.10)
  * builder (2.1.2)
  * bundler (1.0.21)
  * erubis (2.6.6)
  * i18n (0.5.0)
  * json (1.6.1)
  * mail (2.2.19)
  * mime-types (1.16)
  * polyglot (0.3.2)
  * rack (1.2.4)
  * rack-mount (0.6.14)
  * rack-test (0.5.7)
  * rails (3.0.10 fd67735)
  * railties (3.0.10)
  * rake (0.9.2)
  * rdoc (3.11)
  * sqlite3 (1.3.4)
  * thor (0.14.6)
  * treetop (1.4.10)
  * tzinfo (0.3.30)
  * will_paginate (3.0.2)

Load in a few orders

edit script/load_orders.rb
Order.transaction do
  (1..100).each do |i|
    Order.create(:name => "Customer #{i}", :address => "#{i} Main Street",
      :email => "customer-#{i}@example.com", :pay_type => "Check")
  end
end
rails runner script/load_orders.rb

Modify the controller to do pagination

edit app/controllers/orders_controller.rb
  def index
    @orders = Order.paginate page: params[:page], order: 'created_at desc',
      per_page: 10
 
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render xml: @orders }
    end
  end

Add some navigational aids

edit app/views/orders/index.html.erb
<h1>Listing orders</h1>
 
<table>
  <tr>
    <th>Name</th>
    <th>Address</th>
    <th>Email</th>
    <th>Pay type</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
 
<% @orders.each do |order| %>
  <tr>
    <td><%= order.name %></td>
    <td><%= order.address %></td>
    <td><%= order.email %></td>
    <td><%= order.pay_type %></td>
    <td><%= link_to 'Show', order %></td>
    <td><%= link_to 'Edit', edit_order_path(order) %></td>
    <td><%= link_to 'Destroy', order, :confirm => 'Are you sure?',
              :method => :delete %></td>
  </tr>
<% end %>
</table>
 
<br />
 
<%= link_to 'New Order', new_order_path %>
<p><%= will_paginate @orders %></p>

Show the orders

get /orders

Listing orders

Name Address Email Pay type
Customer 100 100 Main Street customer-100@example.com Check Show Edit Destroy
Customer 99 99 Main Street customer-99@example.com Check Show Edit Destroy
Customer 98 98 Main Street customer-98@example.com Check Show Edit Destroy
Customer 97 97 Main Street customer-97@example.com Check Show Edit Destroy
Customer 96 96 Main Street customer-96@example.com Check Show Edit Destroy
Customer 95 95 Main Street customer-95@example.com Check Show Edit Destroy
Customer 94 94 Main Street customer-94@example.com Check Show Edit Destroy
Customer 93 93 Main Street customer-93@example.com Check Show Edit Destroy
Customer 92 92 Main Street customer-92@example.com Check Show Edit Destroy
Customer 91 91 Main Street customer-91@example.com Check Show Edit Destroy

New Order

12.4 Playtime 12.2 Iteration G2: Atom Feeds