The Depot Application

The Depot Application

12.1 Generating the XML Feed 11.3 Iteration F3: Limiting Access

11.4 Iteration F4: Adding a Sidebar, More Administration

</=&gt; #&lt;Product id: nil/> expected but was
<"class ApplicationController &lt; ActionController::Base">.

Traceback:
  /home/rubys/git/awdwr/work-188-239/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb:307:in `assert_select'
  /home/rubys/git/awdwr/checkdepot.rb:189
edit app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  layout "store"
  #...
get /admin

NoMethodError in Admin#index

Showing 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-188-239/depot

Application Trace | Framework Trace | Full Trace

Request

Parameters:

None

Show session dump

Response

Headers:

{"Content-Type"=>"text/html",
 "Cache-Control"=>"no-cache"}

get /users

Listing users

Name
dave Show Edit Destroy

New user
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

Welcome

It's Sat Aug 28 03:25:21 -0400 2010 We have 1 order.
get /users

Listing users

Name
dave Show Edit Destroy

New user
rm app/views/layouts/products.html.erb
rm app/views/layouts/users.html.erb
rm app/views/layouts/orders.html.erb
get /users

Listing users

Name
dave Show Edit Destroy

New user
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 ruby script/console
*** glibc detected *** irb: realloc(): invalid next size: 0x0811c260 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb74c08a3]
/lib/tls/i686/cmov/libc.so.6(realloc+0x10b)[0xb74c27fb]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(ruby_xrealloc+0x62)[0xb7664d72]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_str_resize+0x72)[0xb76b7892]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7661015]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_find_file_ext+0x1f9)[0xb76619d9]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_require_safe+0x154)[0xb7654d44]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_f_require+0x29)[0xb7655259]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb76456b2]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650e3b]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764bbad]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb765578e]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7655c7d]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb76456d5]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650e3b]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764bbad]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650d7c]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764bbad]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764be1b]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7659b33]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_yield+0x21)[0xb765b181]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(rb_ary_each+0x41)[0xb7629fe1]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb76456bc]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650e3b]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764de47]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764e9d4]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650d7c]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764ba6d]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650d7c]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764ba6d]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650d7c]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764ba6d]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7650d7c]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb7651148]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb764ba6d]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8[0xb765bacb]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(ruby_exec+0x22)[0xb765bb02]
/home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8(ruby_run+0x2f)[0xb765becf]
irb[0x80486dd]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7469450]
irb[0x8048621]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:15 2742032    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/bin/ruby
08049000-0804a000 rw-p 00000000 08:15 2742032    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/bin/ruby
0804a000-0812f000 rw-p 0804a000 00:00 0          [heap]
b7200000-b7221000 rw-p b7200000 00:00 0 
b7221000-b7300000 ---p b7221000 00:00 0 
b733f000-b736c000 r-xp 00000000 08:15 2965573    /lib/libncurses.so.5.6
b736c000-b736f000 rw-p 0002c000 08:15 2965573    /lib/libncurses.so.5.6
b736f000-b739b000 r-xp 00000000 08:15 2965623    /lib/libreadline.so.5.2
b739b000-b739f000 rw-p 0002c000 08:15 2965623    /lib/libreadline.so.5.2
b739f000-b73a0000 rw-p b739f000 00:00 0 
b73b0000-b743b000 rw-p b73b0000 00:00 0 
b743b000-b744f000 r-xp 00000000 08:15 7537632    /lib/tls/i686/cmov/libpthread-2.7.so
b744f000-b7451000 rw-p 00013000 08:15 7537632    /lib/tls/i686/cmov/libpthread-2.7.so
b7451000-b7453000 rw-p b7451000 00:00 0 
b7453000-b759c000 r-xp 00000000 08:15 7537573    /lib/tls/i686/cmov/libc-2.7.so
b759c000-b759d000 r--p 00149000 08:15 7537573    /lib/tls/i686/cmov/libc-2.7.so
b759d000-b759f000 rw-p 0014a000 08:15 7537573    /lib/tls/i686/cmov/libc-2.7.so
b759f000-b75a2000 rw-p b759f000 00:00 0 
b75a2000-b75c5000 r-xp 00000000 08:15 7537622    /lib/tls/i686/cmov/libm-2.7.so
b75c5000-b75c7000 rw-p 00023000 08:15 7537622    /lib/tls/i686/cmov/libm-2.7.so
b75c7000-b75d0000 r-xp 00000000 08:15 7537620    /lib/tls/i686/cmov/libcrypt-2.7.so
b75d0000-b75d2000 rw-p 00008000 08:15 7537620    /lib/tls/i686/cmov/libcrypt-2.7.so
b75d2000-b75f9000 rw-p b75d2000 00:00 0 
b75f9000-b75fb000 r-xp 00000000 08:15 7537621    /lib/tls/i686/cmov/libdl-2.7.so
b75fb000-b75fd000 rw-p 00001000 08:15 7537621    /lib/tls/i686/cmov/libdl-2.7.so
b75fd000-b75fe000 rw-p b75fd000 00:00 0 
b75fe000-b7605000 r-xp 00000000 08:15 7537885    /lib/tls/i686/cmov/librt-2.7.so
b7605000-b7607000 rw-p 00006000 08:15 7537885    /lib/tls/i686/cmov/librt-2.7.so
b7607000-b7611000 r-xp 00000000 08:15 2969156    /lib/libgcc_s.so.1
b7611000-b7612000 rw-p 0000a000 08:15 2969156    /lib/libgcc_s.so.1
b7612000-b7616000 r-xp 00000000 08:15 5096017    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/ruby/1.8/i686-linux/readline.so
b7616000-b7617000 rw-p 00003000 08:15 5096017    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/ruby/1.8/i686-linux/readline.so
b7617000-b76e6000 r-xp 00000000 08:15 3195495    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8.8
b76e6000-b76e9000 rw-p 000ce000 08:15 3195495    /home/rubys/.rvm/rubies/ruby-1.8.8-r29126/lib/libruby.so.1.8.8
b76e9000-b76fb000 rw-p b76e9000 00:00 0 
b76fb000-b76fc000 r-xp b76fb000 00:00 0          [vdso]
b76fc000-b7716000 r-xp 00000000 08:15 1796441    /lib/ld-2.7.so
b7716000-b7718000 rw-p 00019000 08:15 1796441    /lib/ld-2.7.so
bfa9b000-bfab0000 rw-p bffeb000 00:00 0          [stack]
Aborted

12.1 Generating the XML Feed 11.3 Iteration F3: Limiting Access