The Depot Application
11.4 Iteration F4: Adding a Sidebar, More Administration
11.3 Iteration F3: Limiting Access
11.4 Iteration F4: Adding a Sidebar, More Administration
edit app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
layout "store"
#...
get /admin
NoMethodError in
Admin#index
Showing /home/rubys/git/awdwr/work-191/depot/app/views/layouts/store.html.erb where line #24 raised:
undefined method `items' for nil:NilClass
Extracted source (around line #24):
21: <div id="side">
22: <!-- START_HIGHLIGHT -->
23: <!-- START:hidden_div -->
24: <% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
25: <%= render(:partial => "cart", :object => @cart) %>
26: <% end %>
27: <!-- END:hidden_div -->
Rails.root: /home/rubys/git/awdwr/work-191/depot
Application Trace |
Framework Trace |
Full Trace
On line #24 of app/views/layouts/store.html.erb
21: <div id="side">
22: <!-- START_HIGHLIGHT -->
23: <!-- START:hidden_div -->
24: <% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
25: <%= render(:partial => "cart", :object => @cart) %>
26: <% end %>
27: <!-- END:hidden_div -->
app/views/layouts/store.html.erb:24:in `_render_template__694282272_8593984_0'
On line #24 of app/views/layouts/store.html.erb
21: <div id="side">
22: <!-- START_HIGHLIGHT -->
23: <!-- START:hidden_div -->
24: <% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
25: <%= render(:partial => "cart", :object => @cart) %>
26: <% end %>
27: <!-- END:hidden_div -->
app/views/layouts/store.html.erb:24:in `_render_template__694282272_8593984_0'
Request
Parameters:
None
Show session dump
_csrf_token: "sFxHWu0C/thDcknZp14Dy+PukYrS0R5/WyyzIfqMgDI="
cart: #<Cart:0x00000003c86de8 @items=[]>
user_id: 1
Show env dump
GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html"
HTTP_COOKIE: "_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly"
HTTP_HOST: "localhost:3000"
HTTP_USER_AGENT: "Ruby"
HTTP_VERSION: "HTTP/1.1"
PATH_INFO: "/admin"
QUERY_STRING: ""
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "localhost"
REQUEST_METHOD: "GET"
REQUEST_PATH: "/"
REQUEST_URI: "http://localhost:3000/admin"
SCRIPT_NAME: ""
SERVER_NAME: "localhost"
SERVER_PORT: "3000"
SERVER_PROTOCOL: "HTTP/1.1"
SERVER_SOFTWARE: "WEBrick/1.3.1 (Ruby/1.9.1/2009-12-07)"
action_controller.instance: #<AdminController:0x00000002a9eef8 @_headers={}, @_formats=[:html], @_request=#<ActionDispatch::Request:0x00000002a9ede0 @env={"GATEWAY_INTERFACE"=>"CGI/1.1", "PATH_INFO"=>"/admin", "QUERY_STRING"=>"", "REMOTE_ADDR"=>"127.0.0.1", "REMOTE_HOST"=>"localhost", "REQUEST_METHOD"=>"GET", "REQUEST_URI"=>"http://localhost:3000/admin", "SCRIPT_NAME"=>"", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"3000", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.9.1/2009-12-07)", "HTTP_ACCEPT"=>"text/html", "HTTP_USER_AGENT"=>"Ruby", "HTTP_COOKIE"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "HTTP_HOST"=>"localhost:3000", "rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x00000003e5f460>, "rack.errors"=>#<IO:<STDERR>>, "rack.multithread"=>false, "rack.multiprocess"=>false, "rack.run_once"=>false, "rack.url_scheme"=>"http", "HTTP_VERSION"=>"HTTP/1.1", "REQUEST_PATH"=>"/", "action_dispatch.parameter_filter"=>[:password], "rack.session"=>{"_csrf_token"=>"sFxHWu0C/thDcknZp14Dy+PukYrS0R5/WyyzIfqMgDI=", "cart"=>#<Cart:0x00000003c86de8 @items=[]>, "user_id"=>1}, "rack.session.options"=>{:key=>"_depot_session", :path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :cookie_only=>true, :secret=>"8c3ecf1db82a2129015f77a059189e070ca50a2c6360e3f5f53bbb9a93bb9cb2a3b31b354d307d44c7b7eb1c9d5a89eea1a67f70aa846681fdfe4c9edb324628", :id=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f"}, "rack.request.cookie_string"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "rack.request.cookie_hash"=>{"_depot_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f", "path"=>"/", "HttpOnly"=>nil}, "rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 3, session_id: "BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUk...", data: "BAh7CEkiEF9jc3JmX3Rva2VuBjoNZW5jb2RpbmciDVVTLUFTQ0l...", created_at: "2010-02-11 19:13:13", updated_at: "2010-02-11 19:13:14">, "action_dispatch.request.path_parameters"=>{:controller=>"admin", :action=>"index"}, "action_controller.instance"=>#<AdminController:0x00000002a9eef8 ...>, "action_dispatch.request.content_type"=>nil, "action_dispatch.request.request_parameters"=>{}, "rack.request.query_string"=>"", "rack.request.query_hash"=>{}, "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.parameters"=>{"controller"=>"admin", "action"=>"index"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">], "action_dispatch.request.formats"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">]}, @filtered_parameters={"controller"=>"admin", "action"=>"index"}>, @_response=#<ActionDispatch::Response:0x00000002a9eda8 @status=200, @header={}, @cache_control={}, @writer=#<Proc:0x00000002a9bbc8@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:47 (lambda)>, @block=nil, @length=0, @cookie=[], @body=[], @sending_file=false, @blank=false, @etag=nil, @request=#<ActionDispatch::Request:0x00000002a9ede0 @env={"GATEWAY_INTERFACE"=>"CGI/1.1", "PATH_INFO"=>"/admin", "QUERY_STRING"=>"", "REMOTE_ADDR"=>"127.0.0.1", "REMOTE_HOST"=>"localhost", "REQUEST_METHOD"=>"GET", "REQUEST_URI"=>"http://localhost:3000/admin", "SCRIPT_NAME"=>"", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"3000", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.9.1/2009-12-07)", "HTTP_ACCEPT"=>"text/html", "HTTP_USER_AGENT"=>"Ruby", "HTTP_COOKIE"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "HTTP_HOST"=>"localhost:3000", "rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x00000003e5f460>, "rack.errors"=>#<IO:<STDERR>>, "rack.multithread"=>false, "rack.multiprocess"=>false, "rack.run_once"=>false, "rack.url_scheme"=>"http", "HTTP_VERSION"=>"HTTP/1.1", "REQUEST_PATH"=>"/", "action_dispatch.parameter_filter"=>[:password], "rack.session"=>{"_csrf_token"=>"sFxHWu0C/thDcknZp14Dy+PukYrS0R5/WyyzIfqMgDI=", "cart"=>#<Cart:0x00000003c86de8 @items=[]>, "user_id"=>1}, "rack.session.options"=>{:key=>"_depot_session", :path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :cookie_only=>true, :secret=>"8c3ecf1db82a2129015f77a059189e070ca50a2c6360e3f5f53bbb9a93bb9cb2a3b31b354d307d44c7b7eb1c9d5a89eea1a67f70aa846681fdfe4c9edb324628", :id=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f"}, "rack.request.cookie_string"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "rack.request.cookie_hash"=>{"_depot_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f", "path"=>"/", "HttpOnly"=>nil}, "rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 3, session_id: "BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUk...", data: "BAh7CEkiEF9jc3JmX3Rva2VuBjoNZW5jb2RpbmciDVVTLUFTQ0l...", created_at: "2010-02-11 19:13:13", updated_at: "2010-02-11 19:13:14">, "action_dispatch.request.path_parameters"=>{:controller=>"admin", :action=>"index"}, "action_controller.instance"=>#<AdminController:0x00000002a9eef8 ...>, "action_dispatch.request.content_type"=>nil, "action_dispatch.request.request_parameters"=>{}, "rack.request.query_string"=>"", "rack.request.query_hash"=>{}, "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.parameters"=>{"controller"=>"admin", "action"=>"index"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">], "action_dispatch.request.formats"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">]}, @filtered_parameters={"controller"=>"admin", "action"=>"index"}>>, @_env={"GATEWAY_INTERFACE"=>"CGI/1.1", "PATH_INFO"=>"/admin", "QUERY_STRING"=>"", "REMOTE_ADDR"=>"127.0.0.1", "REMOTE_HOST"=>"localhost", "REQUEST_METHOD"=>"GET", "REQUEST_URI"=>"http://localhost:3000/admin", "SCRIPT_NAME"=>"", "SERVER_NAME"=>"localhost", "SERVER_PORT"=>"3000", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.9.1/2009-12-07)", "HTTP_ACCEPT"=>"text/html", "HTTP_USER_AGENT"=>"Ruby", "HTTP_COOKIE"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "HTTP_HOST"=>"localhost:3000", "rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x00000003e5f460>, "rack.errors"=>#<IO:<STDERR>>, "rack.multithread"=>false, "rack.multiprocess"=>false, "rack.run_once"=>false, "rack.url_scheme"=>"http", "HTTP_VERSION"=>"HTTP/1.1", "REQUEST_PATH"=>"/", "action_dispatch.parameter_filter"=>[:password], "rack.session"=>{"_csrf_token"=>"sFxHWu0C/thDcknZp14Dy+PukYrS0R5/WyyzIfqMgDI=", "cart"=>#<Cart:0x00000003c86de8 @items=[]>, "user_id"=>1}, "rack.session.options"=>{:key=>"_depot_session", :path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :cookie_only=>true, :secret=>"8c3ecf1db82a2129015f77a059189e070ca50a2c6360e3f5f53bbb9a93bb9cb2a3b31b354d307d44c7b7eb1c9d5a89eea1a67f70aa846681fdfe4c9edb324628", :id=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f"}, "rack.request.cookie_string"=>"_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly", "rack.request.cookie_hash"=>{"_depot_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f", "path"=>"/", "HttpOnly"=>nil}, "rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 3, session_id: "BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUk...", data: "BAh7CEkiEF9jc3JmX3Rva2VuBjoNZW5jb2RpbmciDVVTLUFTQ0l...", created_at: "2010-02-11 19:13:13", updated_at: "2010-02-11 19:13:14">, "action_dispatch.request.path_parameters"=>{:controller=>"admin", :action=>"index"}, "action_controller.instance"=>#<AdminController:0x00000002a9eef8 ...>, "action_dispatch.request.content_type"=>nil, "action_dispatch.request.request_parameters"=>{}, "rack.request.query_string"=>"", "rack.request.query_hash"=>{}, "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.parameters"=>{"controller"=>"admin", "action"=>"index"}, "action_dispatch.request.accepts"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">], "action_dispatch.request.formats"=>[#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">]}, @_action_name="index", @_response_body=nil, @_view_context=#<Class>, @template=#<Class>, @total_orders=1>
action_dispatch.parameter_filter: [:password]
action_dispatch.request.accepts: [#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">]
action_dispatch.request.content_type: nil
action_dispatch.request.formats: [#<Mime::Type:0x000000030606c0 @synonyms=["application/xhtml+xml"], @symbol=:html, @string="text/html">]
action_dispatch.request.parameters: {"controller"=>"admin", "action"=>"index"}
action_dispatch.request.path_parameters: {:controller=>"admin", :action=>"index"}
action_dispatch.request.query_parameters: {}
action_dispatch.request.request_parameters: {}
rack.errors: #<IO:<STDERR>>
rack.input: #<StringIO:0x00000003e5f460>
rack.multiprocess: false
rack.multithread: false
rack.request.cookie_hash: {"_depot_session"=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f", "path"=>"/", "HttpOnly"=>nil}
rack.request.cookie_string: "_depot_session=BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc%3D--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f; path=/; HttpOnly"
rack.request.query_hash: {}
rack.request.query_string: ""
rack.run_once: false
rack.session: {"_csrf_token"=>"sFxHWu0C/thDcknZp14Dy+PukYrS0R5/WyyzIfqMgDI=", "cart"=>#<Cart:0x00000003c86de8 @items=[]>, "user_id"=>1}
rack.session.options: {:key=>"_depot_session", :path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :cookie_only=>true, :secret=>"8c3ecf1db82a2129015f77a059189e070ca50a2c6360e3f5f53bbb9a93bb9cb2a3b31b354d307d44c7b7eb1c9d5a89eea1a67f70aa846681fdfe4c9edb324628", :id=>"BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUkiJTEyY2RjZmQ5NTgxMTcyM2IxNTI2ODVmMDQ0MWQwN2IxSSIQX2NzcmZfdG9rZW4GOwBAB0kiMVVsc0RYcDF3QzV4VlhXUFdSdUhtbVp2cTJNQTNoOHp4dmhRV0RyR2NnZDQ9BjsAQAc=--ea74e695b937c7ab1c8645a7826ea6eb28d5aa0f"}
rack.session.record: #<ActiveRecord::SessionStore::Session id: 3, session_id: "BAh7B0kiD3Nlc3Npb25faWQGOg1lbmNvZGluZyINVVMtQVNDSUk...", data: "BAh7CEkiEF9jc3JmX3Rva2VuBjoNZW5jb2RpbmciDVVTLUFTQ0l...", created_at: "2010-02-11 19:13:13", updated_at: "2010-02-11 19:13:14">
rack.url_scheme: "http"
rack.version: [1, 1]
Response
Headers:
None
get /users
edit app/views/layouts/store.html.erb
<% if @cart %>
<% hidden_div_if(@cart.items.empty?, :id => "cart") do %>
<%= render(:partial => "cart", :object => @cart) %>
<% end %>
<% end %>
get /admin

Pragmatic Bookshelf
Welcome
It's 2010-02-11 14:13:15 -0500
We have 1 order.
get /users
rm app/views/layouts/products.html.erb
rm app/views/layouts/users.html.erb
rm app/views/layouts/orders.html.erb
get /users

Pragmatic Bookshelf
edit app/models/user.rb
require 'digest/sha1'
class User < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name
attr_accessor :password_confirmation
validates_confirmation_of :password
validate :password_non_blank
def self.authenticate(name, password)
user = self.find_by_name(name)
if user
expected_password = encrypted_password(password, user.salt)
if user.hashed_password != expected_password
user = nil
end
end
user
end
# 'password' is a virtual attribute
def password
@password
end
def password=(pwd)
@password = pwd
return if pwd.blank?
create_new_salt
self.hashed_password = User.encrypted_password(self.password, self.salt)
end
after_destroy :ensure_an_admin_remains
def ensure_an_admin_remains
if User.count.zero?
raise "Can't delete last user"
end
end
private
def password_non_blank
errors.add(:password, "Missing password") if hashed_password.blank?
end
def create_new_salt
self.salt = self.object_id.to_s + rand.to_s
end
def self.encrypted_password(password, salt)
string_to_hash = password + "wibble" + salt
Digest::SHA1.hexdigest(string_to_hash)
end
end
edit app/controllers/users_controller.rb
class UsersController < ApplicationController
# GET /users
# GET /users.xml
def index
@users = User.all(:order => :name)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
end
# GET /users/1
# GET /users/1.xml
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @user }
end
end
# GET /users/new
# GET /users/new.xml
def new
@user = User.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @user }
end
end
# GET /users/1/edit
def edit
@user = User.find(params[:id])
end
# POST /users
# POST /users.xml
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(users_url,
:notice => "User #{@user.name} was successfully created.") }
format.xml { render :xml => @user, :status => :created,
:location => @user }
else
format.html { render :action => "new" }
format.xml { render :xml => @user.errors,
:status => :unprocessable_entity }
end
end
end
# PUT /users/1
# PUT /users/1.xml
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to(users_url,
:notice => "User #{@user.name} was successfully updated.") }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @user.errors,
:status => :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.xml
def destroy
@user = User.find(params[:id])
begin
@user.destroy
flash[:notice] = "User #{@user.name} deleted"
rescue Exception => e
flash[:notice] = e.message
end
respond_to do |format|
format.html { redirect_to(users_url) }
format.xml { head :ok }
end
end
end
edit app/controllers/store_controller.rb
def find_cart
@cart = (session[:cart] ||= Cart.new)
end
edit app/controllers/store_controller.rb
before_filter :find_cart, :except => :empty_cart
echo "Product.new" | IRBRC=tmp/irbrc rails console
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:14: warning: already initialized constant VERSION
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:14: warning: already initialized constant RubyGemsVersion
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:194: warning: already initialized constant MUTEX
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:196: warning: already initialized constant RubyGemsPackageVersion
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:202: warning: already initialized constant WIN_PATTERNS
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:1079: warning: already initialized constant MARSHAL_SPEC_DIR
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems.rb:1084: warning: already initialized constant YAML_SPEC_DIR
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/version.rb:72: warning: already initialized constant VERSION_PATTERN
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:20: warning: already initialized constant OPS
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:30: warning: already initialized constant OP_RE
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/version.rb:246: warning: already initialized constant Requirement
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:18: warning: already initialized constant TYPES
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/platform.rb:171: warning: already initialized constant RUBY
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/platform.rb:177: warning: already initialized constant CURRENT
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:39: warning: already initialized constant NONEXISTENT_SPECIFICATION_VERSION
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:50: warning: already initialized constant CURRENT_SPECIFICATION_VERSION
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:56: warning: already initialized constant SPECIFICATION_VERSION_HISTORY
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:72: warning: already initialized constant MARSHAL_FIELDS
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:75: warning: already initialized constant TODAY
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/source_index.rb:593: warning: already initialized constant Cache
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:14: warning: already initialized constant DEFAULT_BACKTRACE
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:15: warning: already initialized constant DEFAULT_BENCHMARK
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:16: warning: already initialized constant DEFAULT_BULK_THRESHOLD
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:17: warning: already initialized constant DEFAULT_VERBOSITY
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:18: warning: already initialized constant DEFAULT_UPDATE_SOURCES
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:24: warning: already initialized constant OPERATING_SYSTEM_DEFAULTS
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:30: warning: already initialized constant PLATFORM_DEFAULTS
/home/rubys/.rvm/ruby-1.9.1-p376/lib/ruby/site_ruby/1.9.1/rubygems/config_file.rb:53: warning: already initialized constant SYSTEM_WIDE_CONFIG_FILE
Loading development environment (Rails 3.0.0.beta1)
>> Product.new
=> #<Product id: nil, title: nil, description: nil, image_url: nil, created_at: nil, updated_at: nil, price: #<BigDecimal:548af28,'0.0',9(18)>>
>>