Agile Web Development with Rails, Edition 4

12.1 Iteration G1: Capturing an Order 11.5 Iteration F5: Making Images Clickable

11.6 Iteration F6: Testing AJAX changes

Verify that yes, indeed, the product index is broken.

get /products

NoMethodError in Products#index

Showing /home/rubys/git/awdwr/edition4/work-32/depot/app/views/layouts/application.html.erb where line #21 raised:

  undefined method `line_items' for nil:NilClass

Extracted source (around line #21):

  18:     <div id="side">
19: <!-- START_HIGHLIGHT -->
20:       <!-- START:hidden_div -->
21:       <%= hidden_div_if(@cart.line_items.empty?, id: 'cart') do %>
22:         <%= render @cart %>
23:       <% end %>
24:     <!-- END:hidden_div -->

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

Application Trace | Framework Trace | Full Trace
app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb___2322265528395497845_32576780'
app/controllers/products_controller.rb:7:in `index'

Request

Parameters:

None

Show session dump

Show env dump

Response

Headers:

None

Conditionally display the cart.

edit app/views/layouts/application.html.erb
      <% if @cart %>
        <%= hidden_div_if(@cart.line_items.empty?, id: 'cart') do %>
          <%= render @cart %>
        <% end %>
      <% end %>

Update the redirect test.

edit test/functional/line_items_controller_test.rb
  test "should create line_item" do
    assert_difference('LineItem.count') do
      post :create, product_id: products(:ruby).id
    end
 
    assert_redirected_to store_path
  end

Add an XHR test.

edit test/functional/line_items_controller_test.rb
  test "should create line_item via ajax" do
    assert_difference('LineItem.count') do
      xhr :post, :create, product_id: products(:ruby).id
    end 
 
    assert_response :success
    assert_select_jquery :html, '#cart' do
      assert_select 'tr#current_item td', /Programming Ruby 1.9/
    end
  end

Add an test in support for the coffeescript changes.

edit test/functional/store_controller_test.rb
  test "markup needed for store.js.coffee is in place" do
    get :index
    assert_select '.store .entry > img', 3
    assert_select '.entry input[type=submit]', 3
  end

Run the tests again.

rake test
Run options: 
 
# Running tests:
 
.......
 
Finished tests in 0.162037s, 43.2000 tests/s, 172.8000 assertions/s.
 
7 tests, 28 assertions, 0 failures, 0 errors, 0 skips
 
ruby -v: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
Run options: 
 
# Running tests:
 
.........................
 
Finished tests in 0.287796s, 86.8671 tests/s, 145.9368 assertions/s.
 
25 tests, 42 assertions, 0 failures, 0 errors, 0 skips
 
ruby -v: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]

Save our progress

git commit -a -m "AJAX"
[master 8247084] AJAX
 5 files changed, 47 insertions(+), 19 deletions(-)
git tag iteration-f

12.1 Iteration G1: Capturing an Order 11.5 Iteration F5: Making Images Clickable