12.1 Iteration G1: Capturing an Order 11.4 Iteration F4: Hide an Empty Cart
</24 tests, 40 assertions, 0 failures, 0 errors/> expected but was <" test \"should create line_item\" do">. Traceback: /home/rubys/svn/rails4/Book/util/checkdepot.rb:135
Verify that yes, indeed, the product index is broken.
get /products
Showing /home/rubys/svn/rails4/Book/util/work/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/svn/rails4/Book/util/work/depot
app/views/layouts/application.html.erb:21
app/controllers/products_controller.rb:7:in `index'
/home/rubys/git/rails/activesupport/lib/active_support/whiny_nil.rb:48:in `method_missing'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:134:in `send'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:134:in `render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:126:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/render/layouts.rb:75:in `_render_layout'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:61:in `_render_template'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:55:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:25:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:114:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:108:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:47:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:55:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:101:in `render_to_string'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:92:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:39:in `render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `ms'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `ms'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:39:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:77:in `cleanup_view_runtime'
/home/rubys/git/rails/activerecord/lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:38:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:10:in `default_render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:258
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:189:in `call'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:189:in `respond_to'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:145:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:433:in `_run__1029162686__process_action__199225275__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:408:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:408:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:28:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:8:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:114:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:40:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:126:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:166
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:27:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:27:in `call'
rack-mount (0.6.3) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:89:in `recognize'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:66:in `optimized_each'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:88:in `recognize'
rack-mount (0.6.3) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:454:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.1.0) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:177:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:235:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:11:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:30:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:365:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:414:in `_run_call_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.1.0) lib/rack/sendfile.rb:105:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:48:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:14:in `call'
rack (1.1.0) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.1.0) lib/rack/lock.rb:11:in `call'
rack (1.1.0) lib/rack/lock.rb:11:in `synchronize'
rack (1.1.0) lib/rack/lock.rb:11:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:145:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:81:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:81:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:15:in `call'
rack (1.1.0) lib/rack/content_length.rb:13:in `call'
rack (1.1.0) lib/rack/handler/webrick.rb:48:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.1.0) lib/rack/handler/webrick.rb:14:in `run'
rack (1.1.0) lib/rack/server.rb:155:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:62:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
/home/rubys/git/rails/activesupport/lib/active_support/whiny_nil.rb:48:in `method_missing'
app/views/layouts/application.html.erb:21
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:134:in `send'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:134:in `render'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/template.rb:126:in `render'
/home/rubys/git/rails/actionpack/lib/action_view/render/layouts.rb:75:in `_render_layout'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:61:in `_render_template'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:55:in `_render_template'
/home/rubys/git/rails/actionpack/lib/action_view/render/rendering.rb:25:in `render'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:114:in `_render_template'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:108:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/renderers.rb:47:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/compatibility.rb:55:in `render_to_body'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:101:in `render_to_string'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:92:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:17:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:39:in `render'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `ms'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/rubys/git/rails/activesupport/lib/active_support/core_ext/benchmark.rb:5:in `ms'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:39:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:77:in `cleanup_view_runtime'
/home/rubys/git/rails/activerecord/lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:38:in `render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:10:in `default_render'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:258
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:189:in `call'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/mime_responds.rb:189:in `respond_to'
app/controllers/products_controller.rb:7:in `index'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:145:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:433:in `_run__1029162686__process_action__199225275__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:408:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:408:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `__send__'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:48:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:28:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:8:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:114:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:40:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:126:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:166
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:27:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:27:in `call'
rack-mount (0.6.3) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:89:in `recognize'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:66:in `optimized_each'
rack-mount (0.6.3) lib/rack/mount/code_generation.rb:88:in `recognize'
rack-mount (0.6.3) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:454:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.1.0) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:177:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:235:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:11:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:30:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:365:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:414:in `_run_call_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:88:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.1.0) lib/rack/sendfile.rb:105:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:48:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:14:in `call'
rack (1.1.0) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.1.0) lib/rack/lock.rb:11:in `call'
rack (1.1.0) lib/rack/lock.rb:11:in `synchronize'
rack (1.1.0) lib/rack/lock.rb:11:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:145:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:81:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:81:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:15:in `call'
rack (1.1.0) lib/rack/content_length.rb:13:in `call'
rack (1.1.0) lib/rack/handler/webrick.rb:48:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.1.0) lib/rack/handler/webrick.rb:14:in `run'
rack (1.1.0) lib/rack/server.rb:155:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:62:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
Parameters:
None
_csrf_token: "jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=" cart_id: 3 session_id: "2ac2869502fde3d4e93add8cb7dcfd96"
GATEWAY_INTERFACE: "CGI/1.1" HTTP_ACCEPT: "text/html" HTTP_COOKIE: "_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly" HTTP_HOST: "localhost:3000" HTTP_VERSION: "HTTP/1.1" PATH_INFO: "/products" QUERY_STRING: "" REMOTE_ADDR: "127.0.0.1" REMOTE_HOST: "localhost" REQUEST_METHOD: "GET" REQUEST_PATH: "/" REQUEST_URI: "http://localhost:3000/products" SCRIPT_NAME: "" SERVER_NAME: "localhost" SERVER_PORT: "3000" SERVER_PROTOCOL: "HTTP/1.1" SERVER_SOFTWARE: "WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)" action_controller.instance: #<ProductsController:0xb67fa0b0 @_request=#<ActionDispatch::Request:0xb67fa04c @env={"action_dispatch.request.formats"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.request.parameters"=>{"action"=>"index", "controller"=>"products"}, "rack.session"=>{"_csrf_token"=>"jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=", "session_id"=>"2ac2869502fde3d4e93add8cb7dcfd96", "cart_id"=>3}, "HTTP_HOST"=>"localhost:3000", "HTTP_ACCEPT"=>"text/html", "SERVER_NAME"=>"localhost", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0xb6bdf284 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "rack.url_scheme"=>"http", "REMOTE_HOST"=>"localhost", "action_dispatch.request.query_parameters"=>{}, "rack.errors"=>#<IO:0xb750c550>, "SERVER_PROTOCOL"=>"HTTP/1.1", "action_dispatch.request.symbolized_path_parameters"=>{:action=>"index", :controller=>"products"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.secret_token"=>"21d0fd931f5c004bf7c6c1dbadeb0271123557a574f21d744399d91c6a47c1ee14eeabd5eddd2d5ef8a07d4cf2b705fd00b48d6f4a3ae22c9b86b0822b563e7a", "rack.version"=>[1, 1], "rack.run_once"=>false, "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)", "REMOTE_ADDR"=>"127.0.0.1", "PATH_INFO"=>"/products", "action_dispatch.request.path_parameters"=>{:action=>"index", :controller=>"products"}, "rack.request.cookie_string"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "SCRIPT_NAME"=>"", "action_dispatch.parameter_filter"=>[:password], "HTTP_VERSION"=>"HTTP/1.1", "rack.multithread"=>false, "HTTP_COOKIE"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "action_dispatch.request.request_parameters"=>{}, "action_dispatch.cookies"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "rack.multiprocess"=>false, "REQUEST_URI"=>"http://localhost:3000/products", "rack.request.query_hash"=>{}, "SERVER_PORT"=>"3000", "action_controller.instance"=>#<ProductsController:0xb67fa0b0 ...>, "rack.session.options"=>{:expire_after=>nil, :secure=>false, :httponly=>true, :domain=>nil, :id=>"2ac2869502fde3d4e93add8cb7dcfd96", :path=>"/"}, "REQUEST_METHOD"=>"GET", "rack.request.query_string"=>"", "action_dispatch.request.content_type"=>nil, "rack.input"=>#<StringIO:0xb6fdfc58>, "QUERY_STRING"=>"", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @filtered_parameters={"action"=>"index", "controller"=>"products"}, @request_method="GET", @method="GET", @fullpath="/products">, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @_initialized_process_action_callbacks=true, @_env={"action_dispatch.request.formats"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.request.parameters"=>{"action"=>"index", "controller"=>"products"}, "rack.session"=>{"_csrf_token"=>"jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=", "session_id"=>"2ac2869502fde3d4e93add8cb7dcfd96", "cart_id"=>3}, "HTTP_HOST"=>"localhost:3000", "HTTP_ACCEPT"=>"text/html", "SERVER_NAME"=>"localhost", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0xb6bdf284 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "rack.url_scheme"=>"http", "REMOTE_HOST"=>"localhost", "action_dispatch.request.query_parameters"=>{}, "rack.errors"=>#<IO:0xb750c550>, "SERVER_PROTOCOL"=>"HTTP/1.1", "action_dispatch.request.symbolized_path_parameters"=>{:action=>"index", :controller=>"products"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.secret_token"=>"21d0fd931f5c004bf7c6c1dbadeb0271123557a574f21d744399d91c6a47c1ee14eeabd5eddd2d5ef8a07d4cf2b705fd00b48d6f4a3ae22c9b86b0822b563e7a", "rack.version"=>[1, 1], "rack.run_once"=>false, "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)", "REMOTE_ADDR"=>"127.0.0.1", "PATH_INFO"=>"/products", "action_dispatch.request.path_parameters"=>{:action=>"index", :controller=>"products"}, "rack.request.cookie_string"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "SCRIPT_NAME"=>"", "action_dispatch.parameter_filter"=>[:password], "HTTP_VERSION"=>"HTTP/1.1", "rack.multithread"=>false, "HTTP_COOKIE"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "action_dispatch.request.request_parameters"=>{}, "action_dispatch.cookies"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "rack.multiprocess"=>false, "REQUEST_URI"=>"http://localhost:3000/products", "rack.request.query_hash"=>{}, "SERVER_PORT"=>"3000", "action_controller.instance"=>#<ProductsController:0xb67fa0b0 ...>, "rack.session.options"=>{:expire_after=>nil, :secure=>false, :httponly=>true, :domain=>nil, :id=>"2ac2869502fde3d4e93add8cb7dcfd96", :path=>"/"}, "REQUEST_METHOD"=>"GET", "rack.request.query_string"=>"", "action_dispatch.request.content_type"=>nil, "rack.input"=>#<StringIO:0xb6fdfc58>, "QUERY_STRING"=>"", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @products=[#<Product id: 4, title: "Debug It!", description: "<p>\n Professional programmers develop a knac...", image_url: "/images/debug.jpg", price: #<BigDecimal:b6613b48,'0.3495E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">, #<Product id: 3, title: "Programming Ruby 1.9", description: "<p>\n Ruby is the fastest growing and most ex...", image_url: "/images/ruby.jpg", price: #<BigDecimal:b6612478,'0.495E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">, #<Product id: 2, title: "Web Design for Developers", description: "<p>\n <em>Web Design for Developers</em> will ...", image_url: "/images/wd4d.jpg", price: #<BigDecimal:b6610eac,'0.4295E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">], @_response=#<ActionDispatch::Response:0xb67f9fe8 @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @request=#<ActionDispatch::Request:0xb67fa04c @env={"action_dispatch.request.formats"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.request.parameters"=>{"action"=>"index", "controller"=>"products"}, "rack.session"=>{"_csrf_token"=>"jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=", "session_id"=>"2ac2869502fde3d4e93add8cb7dcfd96", "cart_id"=>3}, "HTTP_HOST"=>"localhost:3000", "HTTP_ACCEPT"=>"text/html", "SERVER_NAME"=>"localhost", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0xb6bdf284 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "rack.url_scheme"=>"http", "REMOTE_HOST"=>"localhost", "action_dispatch.request.query_parameters"=>{}, "rack.errors"=>#<IO:0xb750c550>, "SERVER_PROTOCOL"=>"HTTP/1.1", "action_dispatch.request.symbolized_path_parameters"=>{:action=>"index", :controller=>"products"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.secret_token"=>"21d0fd931f5c004bf7c6c1dbadeb0271123557a574f21d744399d91c6a47c1ee14eeabd5eddd2d5ef8a07d4cf2b705fd00b48d6f4a3ae22c9b86b0822b563e7a", "rack.version"=>[1, 1], "rack.run_once"=>false, "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)", "REMOTE_ADDR"=>"127.0.0.1", "PATH_INFO"=>"/products", "action_dispatch.request.path_parameters"=>{:action=>"index", :controller=>"products"}, "rack.request.cookie_string"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "SCRIPT_NAME"=>"", "action_dispatch.parameter_filter"=>[:password], "HTTP_VERSION"=>"HTTP/1.1", "rack.multithread"=>false, "HTTP_COOKIE"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "action_dispatch.request.request_parameters"=>{}, "action_dispatch.cookies"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "rack.multiprocess"=>false, "REQUEST_URI"=>"http://localhost:3000/products", "rack.request.query_hash"=>{}, "SERVER_PORT"=>"3000", "action_controller.instance"=>#<ProductsController:0xb67fa0b0 ...>, "rack.session.options"=>{:expire_after=>nil, :secure=>false, :httponly=>true, :domain=>nil, :id=>"2ac2869502fde3d4e93add8cb7dcfd96", :path=>"/"}, "REQUEST_METHOD"=>"GET", "rack.request.query_string"=>"", "action_dispatch.request.content_type"=>nil, "rack.input"=>#<StringIO:0xb6fdfc58>, "QUERY_STRING"=>"", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @filtered_parameters={"action"=>"index", "controller"=>"products"}, @request_method="GET", @method="GET", @fullpath="/products">, @length=0, @status=200, @content_type="text/html", @body=[], @header={}, @block=nil, @writer=#<Proc:0xb6ed7888@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:44>, @etag=nil>, @config=#<OrderedHash {}>, @_action_name="index", @_status=200, @_response_body=nil, @lookup_context=#<ActionView::LookupContext:0xb67f9d2c @details={:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rxml, :erb, :builder, :rjs, :rhtml]}, @view_paths=[#<ActionView::FileSystemResolver:0xb694dcf0 @path=#<Pathname:/home/rubys/svn/rails4/Book/util/work/depot/app/views>, @caching=false, @cached={}>], @details_key=#<ActionView::LookupContext::DetailsKey:0xb6525830 @hash=-618058728>, @skip_default_locale=false, @frozen_formats=true>, @action_has_layout=true> action_dispatch.cookies: {"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"} action_dispatch.parameter_filter: [:password] action_dispatch.remote_ip: #<ActionDispatch::RemoteIp::RemoteIpGetter:0xb6bdf284 @env={"action_dispatch.request.formats"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.request.parameters"=>{"action"=>"index", "controller"=>"products"}, "rack.session"=>{"_csrf_token"=>"jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=", "session_id"=>"2ac2869502fde3d4e93add8cb7dcfd96", "cart_id"=>3}, "HTTP_HOST"=>"localhost:3000", "HTTP_ACCEPT"=>"text/html", "SERVER_NAME"=>"localhost", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0xb6bdf284 ...>, "REQUEST_PATH"=>"/", "rack.url_scheme"=>"http", "REMOTE_HOST"=>"localhost", "action_dispatch.request.query_parameters"=>{}, "rack.errors"=>#<IO:0xb750c550>, "SERVER_PROTOCOL"=>"HTTP/1.1", "action_dispatch.request.symbolized_path_parameters"=>{:action=>"index", :controller=>"products"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>], "action_dispatch.secret_token"=>"21d0fd931f5c004bf7c6c1dbadeb0271123557a574f21d744399d91c6a47c1ee14eeabd5eddd2d5ef8a07d4cf2b705fd00b48d6f4a3ae22c9b86b0822b563e7a", "rack.version"=>[1, 1], "rack.run_once"=>false, "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)", "REMOTE_ADDR"=>"127.0.0.1", "PATH_INFO"=>"/products", "action_dispatch.request.path_parameters"=>{:action=>"index", :controller=>"products"}, "rack.request.cookie_string"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "SCRIPT_NAME"=>"", "action_dispatch.parameter_filter"=>[:password], "HTTP_VERSION"=>"HTTP/1.1", "rack.multithread"=>false, "HTTP_COOKIE"=>"_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly", "action_dispatch.request.request_parameters"=>{}, "action_dispatch.cookies"=>{"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"}, "rack.multiprocess"=>false, "REQUEST_URI"=>"http://localhost:3000/products", "rack.request.query_hash"=>{}, "SERVER_PORT"=>"3000", "action_controller.instance"=>#<ProductsController:0xb67fa0b0 @_request=#<ActionDispatch::Request:0xb67fa04c @env={...}, @filtered_parameters={"action"=>"index", "controller"=>"products"}, @request_method="GET", @method="GET", @fullpath="/products">, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @_initialized_process_action_callbacks=true, @_env={...}, @products=[#<Product id: 4, title: "Debug It!", description: "<p>\n Professional programmers develop a knac...", image_url: "/images/debug.jpg", price: #<BigDecimal:b660e620,'0.3495E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">, #<Product id: 3, title: "Programming Ruby 1.9", description: "<p>\n Ruby is the fastest growing and most ex...", image_url: "/images/ruby.jpg", price: #<BigDecimal:b660e0f8,'0.495E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">, #<Product id: 2, title: "Web Design for Developers", description: "<p>\n <em>Web Design for Developers</em> will ...", image_url: "/images/wd4d.jpg", price: #<BigDecimal:b660db80,'0.4295E2',8(8)>, created_at: "2010-06-07 12:48:35", updated_at: "2010-06-07 12:48:35">], @_response=#<ActionDispatch::Response:0xb67f9fe8 @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @request=#<ActionDispatch::Request:0xb67fa04c @env={...}, @filtered_parameters={"action"=>"index", "controller"=>"products"}, @request_method="GET", @method="GET", @fullpath="/products">, @length=0, @status=200, @content_type="text/html", @body=[], @header={}, @block=nil, @writer=#<Proc:0xb6ed7888@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:44>, @etag=nil>, @config=#<OrderedHash {}>, @_action_name="index", @_status=200, @_response_body=nil, @lookup_context=#<ActionView::LookupContext:0xb67f9d2c @details={:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rxml, :erb, :builder, :rjs, :rhtml]}, @view_paths=[#<ActionView::FileSystemResolver:0xb694dcf0 @path=#<Pathname:/home/rubys/svn/rails4/Book/util/work/depot/app/views>, @caching=false, @cached={}>], @details_key=#<ActionView::LookupContext::DetailsKey:0xb6525830 @hash=-618058728>, @skip_default_locale=false, @frozen_formats=true>, @action_has_layout=true>, "rack.session.options"=>{:expire_after=>nil, :secure=>false, :httponly=>true, :domain=>nil, :id=>"2ac2869502fde3d4e93add8cb7dcfd96", :path=>"/"}, "REQUEST_METHOD"=>"GET", "rack.request.query_string"=>"", "action_dispatch.request.content_type"=>nil, "rack.input"=>#<StringIO:0xb6fdfc58>, "QUERY_STRING"=>"", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true> action_dispatch.request.accepts: [#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>] action_dispatch.request.content_type: nil action_dispatch.request.formats: [#<Mime::Type:0xb6debc08 @string="text/html", @synonyms=["application/xhtml+xml"], @symbol=:html>] action_dispatch.request.parameters: {"action"=>"index", "controller"=>"products"} action_dispatch.request.path_parameters: {:action=>"index", :controller=>"products"} action_dispatch.request.query_parameters: {} action_dispatch.request.request_parameters: {} action_dispatch.request.symbolized_path_parameters: {:action=>"index", :controller=>"products"} action_dispatch.secret_token: "21d0fd931f5c004bf7c6c1dbadeb0271123557a574f21d744399d91c6a47c1ee14eeabd5eddd2d5ef8a07d4cf2b705fd00b48d6f4a3ae22c9b86b0822b563e7a" rack.errors: #<IO:0xb750c550> rack.input: #<StringIO:0xb6fdfc58> rack.multiprocess: false rack.multithread: false rack.request.cookie_hash: {"HttpOnly"=>nil, "_depot_session"=>"BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62", "path"=>"/"} rack.request.cookie_string: "_depot_session=BAh7CCIQX2NzcmZfdG9rZW4iMWpEWEVoSDc3Q3pxaUcwVFNMTG51MWJPeFVaNkEzWW9OTUZ0L2h3WGVaVms9Ig9zZXNzaW9uX2lkIiUyYWMyODY5NTAyZmRlM2Q0ZTkzYWRkOGNiN2RjZmQ5NiIMY2FydF9pZGkI--835850ae46f61597b8755d742c51149506dd5f62; path=/; HttpOnly" rack.request.query_hash: {} rack.request.query_string: "" rack.run_once: false rack.session: {"_csrf_token"=>"jDXEhH77CzqiG0TSLLnu1bOxUZ6A3YoNMFt/hwXeZVk=", "session_id"=>"2ac2869502fde3d4e93add8cb7dcfd96", "cart_id"=>3} rack.session.options: {:expire_after=>nil, :secure=>false, :httponly=>true, :domain=>nil, :id=>"2ac2869502fde3d4e93add8cb7dcfd96", :path=>"/"} rack.url_scheme: "http" rack.version: [1, 1]
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 AJAX 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 'tr#current_item', /Programming Ruby 1.9/
end
Run the tests again.
rake test
(in /home/rubys/svn/rails4/Book/util/work/depot)
Loaded suite /home/rubys/.rvm/gems/ruby-1.8.7-p249%global/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
........
Finished in 0.134033 seconds.
8 tests, 29 assertions, 0 failures, 0 errors
Loaded suite /home/rubys/.rvm/gems/ruby-1.8.7-p249%global/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
........E...............
Finished in 0.675055 seconds.
1) Error:
test_should_create_line_item_via_ajax(LineItemsControllerTest):
ActionView::Template::Error: Missing partial carts/cart with {:handlers=>[:rjs, :rhtml, :rxml, :erb, :builder], :locale=>[:en, :en], :formats=>[:js]} in view paths "/home/rubys/svn/rails4/Book/util/work/depot/app/views"
app/views/line_items/create.js.rjs:1
app/views/line_items/create.js.rjs:1
/test/functional/line_items_controller_test.rb:57:in `test_should_create_line_item_via_ajax'
/test/functional/line_items_controller_test.rb:55:in `test_should_create_line_item_via_ajax'
24 tests, 37 assertions, 0 failures, 1 errors
Errors running test:functionals!
Save our progress
git commit -a -m "AJAX"
Created commit 13dcdf4: AJAX
3 files changed, 39 insertions(+), 4 deletions(-)
git tag iteration-g
12.1 Iteration G1: Capturing an Order 11.4 Iteration F4: Hide an Empty Cart