2014-11-10 3 views
1

Из следующего обучающей, у меня есть этот метод экземпляра для класса Guide, который имеет внутренний класс, класс Config:частного метод «Сохранить» призвала # <Ресторан: 0x00000001619d00> (NoMethodError)

def add 
    puts "\nAdd a restaurant\n\n".upcase 
    restaurant = Restaurant.new 
    print "Restaurant name: " 
    restaurant.name = gets.chomp.strip 
    print "Cuisine type: " 
    restaurant.cuisine = gets.chomp.strip 
    print "Average price: " 
    restaurant.price = gets.chomp.strip 
    # An instance method on the Restaurant class that we'll save 
    if restaurant.save 
     puts "\nRestaurant Added\n\n" 
    else 
     puts "\nSave Error: Restaurant not added\n\n" 
    end 
    end 

Здесь это код класса Ресторан: `

class Restaurant 

    @@filepath = nil 

    def self.filepath=(path=nil) 
     @@filepath = File.join(APP_ROOT, path) 
    end 
    attr_accessor :name, :cuisine, :price 

    def self.file_exists? 
     # class should know if a restaurant file file_exists 
    if @@filepath && File.exists?(@@filepath) 
     return true 
    else 
     return false  
    end 
    end 

    def self.file_usable? 
    return false unless @@filepath 
    return false unless File.exists?(@@filepath) 
    return false unless File.readable?(@@filepath) 
    return false unless File.writable?(@@filepath) 
    return true 
    end 

    def self.create_file 
     # create restaurant file 
    File.open(@@filepath, 'w') unless file_exists? 
    return file_usable? 
    end  

    end 

    def self.saved_restaurants 
     # read the restaurant file 
     # return instances of restaurant 
    end 

    def save 
    return false unless Restaurant.file_usable? 
    File.open(@@filepath, 'a') do |file| 
     file.puts "#{[@name, @cuisine, @price].join("\t")}\n" 
    end 
    return true 
    end 

`

И я получаю эту ошибку говоря, что я звоню частный метод, когда я не:

➜ ruby_executables cd restaurant_app 
➜ restaurant_app git:(master) ✗ ruby ./init.rb 
Found restaurant file 


<<<< Welcome to the Food Finder >>>> 

This is an interactive guide to help you find the food you crave. 

(Enter response or type quit to exit)> list 
Listing... 
(Enter response or type quit to exit)> find 
Finding... 
(Enter response or type quit to exit)> add 

ADD A RESTAURANT 

Restaurant name: sams 
Cuisine type: american 
Average price: 12 
/home/jacqueline/ruby_executables/restaurant_app/lib/guide.rb:97:in `add': private method `save' called for #<Restaurant:0x00000001619d00> (NoMethodError) 
     from /home/jacqueline/ruby_executables/restaurant_app/lib/guide.rb:79:in `do_action' 
     from /home/jacqueline/ruby_executables/restaurant_app/lib/guide.rb:54:in `launch!' 
     from ./init.rb:29:in `<main>' 
➜ restaurant_app git:(master) ✗ 

Я не понимаю, почему я получаю эту ошибку или что делать, чтобы ее исправить.

+1

Вы называете 'restaurant.save' в нашем коде, и' save' кажется приватным (по какой-либо причине). Никто не сможет вам помочь, если вы не покажете нам весь свой код в классе 'Restaurant'. – spickermann

+0

Пожалуйста, покажите класс ресторана. – rderoldan1

+0

Был добавлен код класса ресторана в качестве редактирования вышеуказанного вопроса, @spickermann –

ответ

1

По-видимому, шальная end после create_file метода, который должен был в конце файла class Restaurant, а не в середине файла класса после def create_file блока (вероятно, из-за мое запястье натыкаясь ковриком времени кодирование), был источником ошибки. Удалив его и разместив там, где он был в первую очередь - в самом конце файла class Restaurant, проблема решена, так как программа работает правильно. Но само сообщение об ошибке было ОЧЕНЬ контр-интуитивным для меня, поэтому я не ожидал поиска синтаксической ошибки, такой как блуждающий end, который был неуместным.