tags:

views:

128

answers:

1

Hi Im getting an core error which is really standard I suppose in Ruby but dont know what to make of it. I have a program that I have written. Its purpose is to register guests at a camping. You have a menu with 5 different options. 1. Checkin. When i do this I get a undefined method generateParkingLot' for #<Camping:0x10030a768> (NoMethodError) When I choose Checkout I get a undefined local variable or methoddeparture' for Menu:Class (NameError). So please i someone has a clue to my problem it would be great. I will here paste all my code. The code is separated in different files and I have used require for the different files. Here though I will paste all the code in one trace. Thankful for all help.

-Sebastien

require 'guest'

require 'parking_lot' 

class Camping 

attr_accessor :current_guests, :parking_lots, :all_guests, :staticGuests

def initialize(current_guests, parking_lots, all_guests, staticGuests)

   @current_guests = Array.new()

 # initiera husvagnsplatserna
 @parking_lots = Array.new(32)
 32.times do |nr|
     @parking_lots[nr] = Parking_Lot.new(nr)

    @staticGuests = Array[ 
    Guest.new("Logan Howlett", "Tokyo", "07484822",1, @parking_lots[0]), 
    Guest.new("Scott Summers", "Chicago", "8908332", 2, @parking_lots[1]),
        Guest.new("Hank Moody", "Boston", "908490590", 3, @parking_lots[2]),
        Guest.new("Jean Grey", "Detroit", "48058221", 4, @parking_lots[3]),
        Guest.new("Charles Xavier","Washington DC", "019204822",5, @parking_lots[4])
            ] 

   end 

@all_guests = []    

  @staticGuests.each do |guest|
  @current_guests[guest.plot.nr] = guest
  @all_guests.push(guest)
 end                            
end


def to_s
    # creates an empty string 
    list = " "

    # loop from 1 to 32
    (1..32).each do |n|
        if (!@current_guests[n-1].nil?)
            list += @current_guests[n-1].to_s
        else
            # else adds the text "Vacant"
            list += n.to_s + ": Vacant!\n"
        end
    return list
end

def generateParkingLot

    randomNr = 1+rand(32)
    # exists a guest at the (0-based) position?
    if (!@current_guests[randomNr-1].nil?)
        # if so generate a new figure
      generateEmpty(array)
    else
        # returns the generated number
        return randomNr
    end
    end
     end
  end

class Guest

attr_accessor :firstname, :lastname, :address, :phone, :departure
attr_reader :arrived, :plot


def initialize (firstName, lastName, address, phone, plot)  
 @firstName = firstName
 @lastName = lastName
 @address = address
 @phone = phone
 @arrived = arrived
 @plot = plot           

end

  def to_s 
    "Personal information:
     (#{@firstName}, #{@lastName}, #{@address}, #{@phone}, #{@arrived}, #{@departure},      #{@plot})" 
  end 
end                     


require 'ruby_camping'
require 'camping_guests'

class Main  

if __FILE__ == $0   
  $camping = Camping.new(@current_guests, @all_guests, @parking_lots,@staticGuests)
  puts "\n"
  puts "Welcome to Ruby Camping!"

 while (true)
   Menu.menu
  end
 end   
end 


require 'date'                     
require 'camping_guests' 
require 'guest'

class Menu

def initialize(guests = [])
    @camping = Camping.new(guests)
end



def self.menu  
  puts "---------------------------"
  puts "      Menu"                          
  puts "  1. Checkin"
  puts "  2. Checkout"
  puts "  3. List current guests"
  puts "  4. List all guests"
  puts "  5. Exit\n"
  puts ""
  puts " What do you want to do?"
  puts "---------------------------"
  print ": "
  action = get_input
    do_action(action)
end

# fetches menu choice and returns chosen alternativ 
def self.get_input  
  input = gets.chomp.to_i

 while (input > 5 || input < 1) do
     puts "Ooups, please try again."
     input = gets.chomp.to_i
 end 
  return input
end

def self.do_action(action)
  case action
     when 1:
        check_in
     when 2:
        check_out
     when 3:
       puts $camping.current_guests
      when 4:
       puts $camping.all_guests
      when 5:
       puts "You are now leaving the camping, welcome back!"
       exit    
    end
  end


def self.check_in
    puts "Welcome to the checkin"
    puts "Please state your first name: "
    firstName = gets.chomp
    puts "Please state your last name:"
    lastName = gets.chomp
    puts "Write your address: "
    address = gets.chomp
    puts "and your phone number: "
    phone = gets.chomp
    puts "finally, your arrival date!"
    arrived = gets.chomp
    newPLot = $camping.generateParkingLot
    newGuest = Guest.new(firstName, lastName, address,    phone,arrived,$camping.parking_lots[newPLot-1])
    $camping.current_guests[newPLot-1] = newGuest
    @all_guests.push(newGuest) 
    puts "The registration was a success!! You have received the  " + newPLot.to_s + "."
  end                          

  def self.check_out 
    puts "Welcome to checkout!"
    puts $camping.all_guests
    puts "State plot of the person to checkout!"
    plot = gets.chomp.to_i
    puts "Ange utcheckningsdatum: "
    departureDate = gets.chomp.to_i
    guest = $camping.current_guests[plot-1]      
    @departure = departure   
    guest.departure = departureDate
    guestStayedDays = departureDate - guest.arrived      
    guest.plot.increase(guestStayedDays)                
    puts guest                                      
    $camping.current_guests[plot-1] = nil               
  end
 end


class Parking_Lot

attr_accessor :nr
attr_reader :electricity_meter

def initialize (nr)
    @nr = nr
    @electricity_meter = 4000-rand(2000)    
    end

def increase_meter(days)
    generatedUse = (10+rand(70))*days
    puts "Increases the meter with " + generatedUse.to_s + " kWh."
    @electricity_meter += generatedUse
end

def to_s

  "Plot #{@nr+1} Electricity meter: #{@electricity_meter} kWh"

end 
 end 
A: 

It looks (although I haven't tried this out) like some of your your 'end's are wrong.

The one which is causing your first error (generateParkingLot undefined) is that generateParkingLot is actually defined inside to_s, so you need an extra 'end' at the end of your to_s method.

As for the second error (departure not recognised), the folowing line in self.check_out is at fault:

@departure = departure

because there is no 'departure' variable. (Perhaps you meant DepartureDate?). I suspect there may be a few other issues with this code, but I'm afraid I don't really have time to check now.

One I noticed was that when you have

32.times do |nr|
     @parking_lots[nr] = Parking_Lot.new(nr)

I think you might want to end that, either with an 'end' or curly brackets, e.g.

32.times do |nr|
     @parking_lots[nr] = Parking_Lot.new(nr)
end

Although that would make your other blocks not match.. In general, just try and make sure your blocks are all defined properly (e.g. everything has a matching end).

Grant Crofton
Thanks for the help Grant. I did as u said and started checking he blocks to see that they all had matching ends. Did not find any missing though. Do you have any clue?!
Sebastien
Did you know that you need an end for those 'do' loops, like the **32.times do |nr|** from my respose? It isn't like C# etc where you can have a single line without ending the block, and it doesn't end when you do a return statement. That's why your generateParkingLot method doesn't work, because your **(1..32).each do |n|** method inside to_s isn't closed, so the to_s method isn't closed. Put another End at the end of your to_s method and you should at least get the generateParkingLot method working.
Grant Crofton
Tricky to find a decent tutorial just on 'do' blocks, but this might help: http://ruby.about.com/od/rubyfeatures/a/loops_2.htm
Grant Crofton
Will do thank you for your advices and help!
Sebastien