2010-08-02 4 views
2

Salut Im obtenir une erreur de base qui est vraiment standard je suppose en Ruby, mais ne sais pas quoi en faire. J'ai un programme que j'ai écrit. Son but est d'inscrire les invités à un camping. Vous avez un menu avec 5 options différentes. 1. Checkin. Quand je fais cela, j'obtiens une méthode non définie generateParkingLot' for #<Camping:0x10030a768> (NoMethodError) When I choose Checkout I get a undefined local variable or method départ 'pour Menu: Class (NameError). Donc, s'il vous plaît je quelqu'un a la moindre idée de mon problème ce serait génial. Je vais coller ici tout mon code. Le code est séparé dans différents fichiers et j'ai utilisé require pour les différents fichiers. Ici, bien que je vais coller tout le code dans une trace. Merci pour toute aide.Aide! check_in ': méthode non définie `push' pour nil: NilClass (NoMethodError)

-Sébastien

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 ([email protected]_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 ([email protected]_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   

fin

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 
+1

Votre message présente de sérieux problèmes de formatage. S'il vous plaît modifier. –

+0

Oui, vous devez mettre quatre espaces au début de chaque ligne de code afin qu'il soit formaté en tant que code –

+0

Merci pour l'aide les gars avec le formatage du code. – Sebastien

Répondre

1

Il semble (bien que je ne l'ai pas essayé ceci) comme une partie de votre votre « fin de sont fausses.

Celui qui est l'origine de votre première erreur (generateParkingLot undefined) est que generateParkingLot est en fait défini à l'intérieur to_s, vous avez besoin d'une « fin » supplémentaire à la fin de votre méthode to_s.

Quant à la deuxième erreur (départ non reconnu), la ligne que vous avez choisi dans self.check_out est en faute:

@departure = departure 

parce qu'il n'y a pas de variable « de départ ». (Peut-être vouliez-vous dire DepartureDate?). Je pense qu'il y a peut-être d'autres problèmes avec ce code, mais je crains de ne pas avoir vraiment le temps de vérifier maintenant.

Un j'ai remarqué est que lorsque vous avez

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

Je pense que vous voudrez peut-être mettre fin à cela, soit avec une « fin » ou accolades, par exemple

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

Bien que cela rendrait vos autres blocs correspondent pas .. En général, juste essayer et assurez-vous que vos blocs sont tous définis correctement (par exemple tout a une fin correspondante).

+0

Merci pour l'aide Grant. J'ai fait comme vous l'avez dit et j'ai commencé à vérifier qu'il bloque pour voir qu'ils avaient tous des extrémités correspondantes. Je n'ai pas trouvé manquant cependant. Avez-vous la moindre idée ?! – Sebastien

+0

Saviez-vous que vous avez besoin d'une fin pour ces boucles 'do', comme le ** 32.times do | nr | ** de mon respose? Ce n'est pas comme C# etc où vous pouvez avoir une seule ligne sans terminer le bloc, et cela ne se termine pas quand vous faites une déclaration de retour. C'est pourquoi votre méthode generateParkingLot ne fonctionne pas, car votre ** (1..32).chacun do | n | méthode ** à l'intérieur to_s n'est pas fermée, la méthode de to_s n'est pas fermée. Mettez une autre extrémité à la fin de votre méthode de to_s et vous devriez obtenir au moins le fonctionnement de la méthode generateParkingLot. –

+0

Tricky pour trouver un tutoriel décent juste à « faire » des blocs, mais cela pourrait aider: http://ruby.about.com/od/rubyfeatures/a/loops_2.htm –

Questions connexes