Agile Web Development with Rails, Edition 4

25.1 rack 21.2 Form Helpers

24.3 Active Resources

Expected at least 1 element matching ".price", found 0.

Traceback:
  /home/rubys/git/awdwr/edition4/checkdepot.rb:448:in `block in <class:DepotTest>'

Restart the server.

bundle exec /home/rubys/git/rails/bin/rails new depot_client --skip-bundle
      create  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  log
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  public/images
      create  public/images/rails.png
      create  public/stylesheets
      create  public/stylesheets/.gitkeep
      create  public/javascripts
      create  public/javascripts/application.js
      create  public/javascripts/controls.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/effects.js
      create  public/javascripts/prototype.js
      create  public/javascripts/rails.js
      create  script
      create  script/rails
      create  test
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance/browsing_test.rb
      create  test/test_helper.rb
      create  test/unit
      create  tmp
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep
bundle install --local
Resolving dependencies...
Using rake (10.1.1)
Using abstract (1.0.0)
Using activesupport (3.0.20) from source at /home/rubys/git/rails
Using builder (2.1.2)
Using i18n (0.5.3)
Using activemodel (3.0.20) from source at /home/rubys/git/rails
Using erubis (2.6.6)
Using rack (1.2.8)
Using rack-mount (0.6.14)
Using rack-test (0.5.7)
Using tzinfo (0.3.38)
Using actionpack (3.0.20) from source at /home/rubys/git/rails
Using mime-types (1.25.1)
Using polyglot (0.3.3)
Using treetop (1.4.15)
Using mail (2.2.20)
Using actionmailer (3.0.20) from source at /home/rubys/git/rails
Using arel (2.0.10)
Using activerecord (3.0.20) from source at /home/rubys/git/rails
Using activeresource (3.0.20) from source at /home/rubys/git/rails
Using bundler (1.5.2)
Using json (1.8.1)
Using rdoc (3.12.2)
Using thor (0.14.6)
Using railties (3.0.20) from source at /home/rubys/git/rails
Using rails (3.0.20) from source at /home/rubys/git/rails
Using sqlite3 (1.3.8)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
edit app/models/product.rb
  class Product < ActiveResource::Base
    self.site = 'http://dave:secret@localhost:3000/'
  end
echo "Product.find(2).title" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> Product.find(2).title
=> "CoffeeScript"
>> 
edit app/controllers/line_items_controller.rb
  def create
      if params[:line_item]
        # ActiveResource
        params[:line_item][:order_id] = params[:order_id]
        @line_item = LineItem.new(params[:line_item])
      else
        # HTML forms
      product = Product.find(params[:product_id])
      @line_item = @cart.add_product(product.id)
      end
    @line_item.product = product
 
    respond_to do |format|
      if @line_item.save
        format.html { redirect_to(store_url) }
        format.js   { @current_item = @line_item }
        format.xml  { render :xml => @line_item,
          :status => :created, :location => @line_item }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @line_item.errors,
          :status => :unprocessable_entity }
      end
    end
  end
edit config/routes.rb
Depot::Application.routes.draw do
  get 'admin' => 'admin#index'
  controller :sessions do
    get  'login' => :new
    post 'login' => :create
    delete 'logout' => :destroy
  end
 
  resources :users
  resources :products do
    get :who_bought, on: :member
  end
 
  scope '(:locale)' do
    resources :orders do
      resources :line_items
    end
 
    resources :line_items
    resources :carts
    root to: "store#index", as: 'store'
  end
end
echo "Product.find(2).title" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> Product.find(2).title
=> "CoffeeScript"
>> 
echo "p = Product.find(2)\\nputs p.price\\np.price -= 5\\np.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> p = Product.find(2)
=> #<Product:0x00000002c1adc0 @attributes={"created_at"=>2014-02-04 20:40:52 UTC, "description"=>"<p>\n        CoffeeScript is JavaScript done right. It provides all of JavaScript's\n\tfunctionality wrapped in a cleaner, more succinct syntax. In the first\n\tbook on this exciting new language, CoffeeScript guru Trevor Burnham\n\tshows you how to hold onto all the power and flexibility of JavaScript\n\twhile writing clearer, cleaner, and safer code.\n      </p>", "id"=>2, "image_url"=>"/images/cs.jpg", "price"=>#<BigDecimal:2c1d1b0,'0.36E2',9(18)>, "title"=>"CoffeeScript", "updated_at"=>2014-02-04 20:40:52 UTC}, @prefix_options={}>
>> puts p.price
36.0
=> nil
>> p.price -= 5
=> #<BigDecimal:2be5508,'0.31E2',9(27)>
>> p.save
=> true
>> 

expire cache

rm -rf /home/rubys/git/awdwr/edition4/work-192-30/depot/tmp/cache

fetch storefront

get /

NameError in Store#index

Showing /home/rubys/git/awdwr/edition4/work-192-30/depot/app/views/store/index.html.erb where line #6 raised:

uninitialized constant I18n::RESERVED_KEYS

Extracted source (around line #6):

3: <% end %>
4: 
5: <!-- START_HIGHLIGHT -->
6: <h1><%= t('.title_html') %></h1>
7: <!-- END_HIGHLIGHT -->
8: 
9: <% @products.each do |product| %>

Rails.root: /home/rubys/git/awdwr/edition4/work-192-30/depot

Application Trace | Framework Trace | Full Trace
app/views/store/index.html.erb:6:in `_app_views_store_index_html_erb___2964376750573579948_69908921373540_456367400050179959'

Request

Parameters:

None

Show session dump

Show env dump

Response

Headers:

None

fetch product (fallback in case storefront is cached)

get /login
Please Log In
post /login?locale=en
You are being redirected.
get http://localhost:3000/admin?locale=en

Welcome

It's 2014-02-04 15:45:47 -0500 We have 1 order.
get /products/2

Title: CoffeeScript

Description: <p> CoffeeScript is JavaScript done right. It provides all of JavaScript's functionality wrapped in a cleaner, more succinct syntax. In the first book on this exciting new language, CoffeeScript guru Trevor Burnham shows you how to hold onto all the power and flexibility of JavaScript while writing clearer, cleaner, and safer code. </p>

Image url: /images/cs.jpg

Price: 31.0

Edit | Back
edit app/models/order.rb
  class Order < ActiveResource::Base
    self.site = 'http://dave:secret@localhost:3000/'
  end
echo "Order.find(1).name\\nOrder.find(1).line_items\\n" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> Order.find(1).name
=> "Dave Thomas"
>> Order.find(1).line_items
NoMethodError: undefined method `line_items' for #<Order:0x0000000269eb08>
	from /home/rubys/git/rails/activeresource/lib/active_resource/base.rb:1401:in `method_missing'
	from (irb):2
	from /home/rubys/git/rails/railties/lib/rails/commands/console.rb:44:in `start'
	from /home/rubys/git/rails/railties/lib/rails/commands/console.rb:8:in `start'
	from /home/rubys/git/rails/railties/lib/rails/commands.rb:23:in `<top (required)>'
	from script/rails:6:in `require'
	from script/rails:6:in `<main>'
>> 
edit app/models/line_item.rb
  class LineItem < ActiveResource::Base
    self.site = 'http://dave:secret@localhost:3000/orders/:order_id'
  end
post /logout?locale=en
You are being redirected.
get http://localhost:3000/en

NameError in Store#index

Showing /home/rubys/git/awdwr/edition4/work-192-30/depot/app/views/store/index.html.erb where line #6 raised:

uninitialized constant I18n::RESERVED_KEYS

Extracted source (around line #6):

3: <% end %>
4: 
5: <!-- START_HIGHLIGHT -->
6: <h1><%= t('.title_html') %></h1>
7: <!-- END_HIGHLIGHT -->
8: 
9: <% @products.each do |product| %>

Rails.root: /home/rubys/git/awdwr/edition4/work-192-30/depot

Application Trace | Framework Trace | Full Trace
app/views/store/index.html.erb:6:in `_app_views_store_index_html_erb___2964376750573579948_19378500_456367400050179959'

Request

Parameters:

{"locale"=>"en"}

Show session dump

Show env dump

Response

Headers:

None

echo "LineItem.find(:all, :params => {:order_id=>1})" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> LineItem.find(:all, :params => {:order_id=>1})
=> [#<LineItem:0x000000032769f8 @attributes={"cart_id"=>nil, "created_at"=>2014-02-04 20:42:40 UTC, "id"=>10, "price"=>#<BigDecimal:327bc00,'0.36E2',9(18)>, "product_id"=>2, "quantity"=>1, "updated_at"=>2014-02-04 20:42:56 UTC}, @prefix_options={:order_id=>1}>]
>> 
echo "li = LineItem.find(:all, :params => {:order_id=>1}).first\\nputs li.price\\nli.price *= 0.8\\nli.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> li = LineItem.find(:all, :params => {:order_id=>1}).first
=> #<LineItem:0x0000000360b960 @attributes={"cart_id"=>nil, "created_at"=>2014-02-04 20:42:40 UTC, "id"=>10, "price"=>#<BigDecimal:364fc28,'0.36E2',9(18)>, "product_id"=>2, "quantity"=>1, "updated_at"=>2014-02-04 20:42:56 UTC}, @prefix_options={:order_id=>1}>
>> puts li.price
36.0
=> nil
>> li.price *= 0.8
=> 28.8
>> li.save
=> true
>> 
get /orders/1/line_items.xml
<?xml version="1.0" encoding="UTF-8"?>
<line-items type="array">
  <line-item>
    <cart-id type="integer" nil="true"></cart-id>
    <created-at type="datetime">2014-02-04T20:42:40Z</created-at>
    <id type="integer">10</id>
    <order-id type="integer">1</order-id>
    <price type="decimal">28.8</price>
    <product-id type="integer">2</product-id>
    <quantity type="integer">1</quantity>
    <updated-at type="datetime">2014-02-04T20:42:56Z</updated-at>
  </line-item>
</line-items>
echo "LineItem.format = :xml\\nli = LineItem.find(:all, :params => {:order_id=>1}).first\\nputs li.price\\nli.price *= 0.8\\nli.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> LineItem.format = :xml
=> :xml
>> li = LineItem.find(:all, :params => {:order_id=>1}).first
=> #<LineItem:0x000000033e9290 @attributes={"cart_id"=>nil, "created_at"=>2014-02-04 20:42:40 UTC, "id"=>10, "price"=>#<BigDecimal:33f93c0,'0.288E2',18(18)>, "product_id"=>2, "quantity"=>1, "updated_at"=>2014-02-04 20:42:56 UTC}, @prefix_options={:order_id=>1}>
>> puts li.price
28.8
=> nil
>> li.price *= 0.8
=> 23.040000000000003
>> li.save
=> true
>> 
echo "li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :price=>0.0)\\nli2.save" | IRBRC=tmp/irbrc rails console
Loading development environment (Rails 3.0.20)
Switch to inspect mode.
>> li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :price=>0.0)
=> #<LineItem:0x00000003c850c0 @attributes={"product_id"=>2, "quantity"=>1, "price"=>0.0}, @prefix_options={:order_id=>1}>
>> li2.save
=> true
>> 

25.1 rack 21.2 Form Helpers