Agile Web Development with Rails, Edition 4
11.6 Iteration F6: Testing AJAX changes
11.4 Iteration F4: Hide an Empty Cart
11.5 Iteration F5: Making Images Clickable
Review our current storefront markup
edit app/views/store/index.html.erb
<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>
<h1>Your Pragmatic Catalog</h1>
<% @products.each do |product| %>
<div class="entry">
<%= image_tag(product.image_url) %>
<h3><%= product.title %></h3>
<%= sanitize(product.description) %>
<div class="price_line">
<span class="price"><%= number_to_currency(product.price) %></span>
<%= button_to 'Add to Cart', line_items_path(product_id: product),
remote: true %>
</div>
</div>
<% end %>
Associate image clicks with submit button clicks
edit app/assets/javascripts/store.js.coffee
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
$(document).on "ready page:change", ->
$('.store .entry > img').click ->
$(this).parent().find(':submit').click()
The page looks no different
get /
Pragmatic Bookshelf
Your Cart
1×
CoffeeScript
$36.00
Total
$36.00
Your Pragmatic Catalog
CoffeeScript
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.
Programming Ruby 1.9 & 2.0
Ruby is the fastest growing and most exciting dynamic language
out there. If you need to get working programs delivered fast,
you should add Ruby to your toolbox.
Rails Test Prescriptions
Rails Test Prescriptions is a comprehensive guide to testing
Rails applications, covering Test-Driven Development from both a
theoretical perspective (why to test) and from a practical perspective
(how to test effectively). It covers the core Rails testing tools and
procedures for Rails 2 and Rails 3, and introduces popular add-ons,
including Cucumber, Shoulda, Machinist, Mocha, and Rcov.
Run tests... oops.
rake test
Run options:
# Running tests:
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
.......
Finished tests in 0.408741s, 17.1258 tests/s, 68.5030 assertions/s.
7 tests, 28 assertions, 0 failures, 0 errors, 0 skips
Run options:
# Running tests:
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
...E...F.EEEE....EEEE..
Finished tests in 0.721062s, 31.8974 tests/s, 36.0579 assertions/s.
1) Error:
test_should_get_index(CartsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
2) Failure:
test_should_create_line_item(LineItemsControllerTest) [/home/rubys/git/awdwr/edition4/work-193-32/depot/test/functional/line_items_controller_test.rb:28]:
Expected response to be a redirect to <"http://test.host/carts/980190963"> but was a redirect to <"http://test.host/">
3) Error:
test_should_get_edit(LineItemsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
4) Error:
test_should_get_index(LineItemsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
5) Error:
test_should_get_new(LineItemsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
6) Error:
test_should_show_line_item(LineItemsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
7) Error:
test_should_get_edit(ProductsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
8) Error:
test_should_get_index(ProductsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
9) Error:
test_should_get_new(ProductsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
10) Error:
test_should_show_product(ProductsControllerTest):
ActionView::Template::Error: undefined method `line_items' for nil:NilClass
/home/rubys/git/awdwr/edition4/work-193-32/depot/app/views/layouts/application.html.erb:21:in `_app_views_layouts_application_html_erb__314416804390603389_36164560'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:145:in `block in render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `block in instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:123:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:143:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/rubys/git/rails/actionpack/lib/action_view/renderer/renderer.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:88:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:16:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
23 tests, 26 assertions, 1 failures, 9 errors, 0 skips
Errors running test:functionals! #<RuntimeError: Command failed with status (10): [ruby -I"lib:test" -I"/home/rubys/.rvm/gems/ruby-1.9.3-p545/gems/rake-10.2.1/lib" "/home/rubys/.rvm/gems/ruby-1.9.3-p545/gems/rake-10.2.1/lib/rake/rake_test_loader.rb" "test/functional/**/*_test.rb" ]>
11.6 Iteration F6: Testing AJAX changes
11.4 Iteration F4: Hide an Empty Cart