2015-10-02 5 views
1

Извиняюсь за любительский вопрос, я все еще учусь. Я пытаюсь извлечь информацию из файла YAML в Ruby. Я думал, что, поскольку я переместил информацию в массив, все, что мне нужно, это напечатать массив. Я знаю, что это не так, но я не мог найти ничего в документации, когда смотрел.Чтение файла YAML в Ruby

require "yaml" 

class BankAccount 

attr_accessor :first_name, :last_name, :address, :your_account 

def initialize 
    @your_account = [] 
    open() 
end 

def open 
    if File.exist?("accountinfo.yml") 
    @your_account = YAML.load_file("accountinfo.yml") 
    end 
end 

def save 
    File.open("accountinfo.yml", "r+") do |file| 
     file.write(your_account.to_yaml) 
    end 
end 

def new_account(first_name, last_name, address) 
    puts "Enter your first name:" 
    first_name = gets.chomp 
    puts "Enter your last name" 
    last_name = gets.chomp 
    puts "Enter your address:" 
    address = gets.chomp 
end 

def account_review(your_account) 
    puts @your_acccount 
end 

def run 
    loop do 
     puts "Welcome to the bank." 
     puts "1. Create New Account" 
     puts "2. Review Your Account Information" 
     puts "3. Check Your Balance" 
     puts "4. Exit" 
     puts "Enter your choice:" 
      input = gets.chomp 
      case input 
      when '1' 
       new_account(first_name, last_name, address) 
      when '2' 
       account_review(your_account) 
      when '4' 
       save() 
       break 
      end 
    end 
end 

end 
bank_account = BankAccount.new 
bank_account.run 
+0

Что вы больше всего рискуете? Вы получаете сообщение об ошибке, является ли файл пустым, как выглядит содержимое файла? – spickermann

+0

Не могли бы вы разместить содержимое accountinfo.yml тоже, пожалуйста? – stef

+0

Файл создается в папке, но когда программа запускается и я пытаюсь выбрать опцию для чтения информации, она не выполняется. Я не уверен, сохранена ли информация в файле или нет. Я не могу сказать, правильно ли я загружаю файл, и это причина, по которой он не отображается, или если программа только что создала файл, но никогда не писала ему вообще. – cpppatrick

ответ

0

Если вы используете Rails, вот простой способ для чтения файла YAML (что говорит название)

# Load the whatever_config from whatever.yml 
whatever_config = YAML.load(ERB.new(File.read(Rails.root.join("config/whatever.yml"))).result)[Rails.env] 

# Extract the foo variable out 
foo = whatever_config['foo'] 

Я не думаю, что я действительно понимаю, что ваш вопрос, точно ?

2

Когда я сталкиваюсь с чем-то подобным, я считаю, что проще всего использовать irb, чтобы увидеть, как выглядит файл YAML после его загрузки. Иногда это может быть в формате, тонко отличающемся от того, что вы ожидали.

В этом же каталоге, в командной строке, запустите irb.

У вас есть интерактивная консоль Ruby, где вы можете запускать команды.

require 'pp' - это поможет вам легче увидеть выход.

Тогда:

your_account = YAML.load_file("accountinfo.yml") 
pp your_account 

В приведенном выше коде, оказывается, что в методе new_account, вы на самом деле не устанавливая эти атрибуты @your_account, и в методе сохранения вы пишете неопределенную переменную к ямлю.

Сохранить должно быть:

file.write(@your_account.to_yaml) 

Новая учетная запись должна заканчиваться:

@your_account[:first_name] = first_name 
@your_account[:last_name] = last_name 
@your_account[:address] = address 
1

Вы никогда не установите переменные. Префикс сеттера с self., иначе вы бы просто создали локальную переменную с тем же именем. Кроме того, вы не установите your_acccount на всех:

def new_account 
    puts "Enter your first name:" 
    self.first_name = gets.chomp 
    puts "Enter your last name" 
    self.last_name = gets.chomp 
    puts "Enter your address:" 
    self.address = gets.chomp 

    self.your_account = [first_name, last_name, address] 
end 

Другой вопрос, будет то, что ваш код никогда не вызывает open. Это означает, что все работает нормально, пока вы не закончите программу и не перезапустите ее. Просто позвоните open, прежде чем позвонить account_review, чтобы исправить это.

+0

Для моего уточнения, используя префикс «self», вместо переменной локатора создается переменная класса? – cpppatrick

+0

Нет, использование 'self' сообщает Ruby искать метод с таким именем (который существует, потому что вы создали этот метод с помощью' attr_accessor') вместо создания локальной переменной.В основном у вас есть два варианта установки переменных экземпляра: 1) Непосредственно, вызывая '@ variable_name =' или 2, вызывая 'self.variable_name =', если у вас есть метод setter. – spickermann

+0

А, спасибо. Это имеет больший смысл. – cpppatrick

Смежные вопросы