2017-10-15 1 views
1

Ich bin neu in Ruby, also bitte verzeih die Noobishness.Benutzerdaten in CSV-Datei speichern

Ich habe eine Klasse „User“, die haben Methoden erstellen und zeigen alle Benutzer speichern müssen „Benutzer“ Daten in CSV-Datei

Das ist, was ich

class User 
    attr_accessor :name, :age, :email 

    def initialize(name:, age:, email:) 
    @name = name 
    @age = age 
    @email = email 
    end 

    def create 
    @users = [@name, @age, @email] 
    end 

    def self.all 
    ObjectSpace.each_object(self).map(&:create) 
    end 

    def self.save_to_csv 
    CSV.open(users.csv, "w") do |csv| 
    @users.each { |i| csv.puts "#{i.name}, #{i.age}, #{i.email}" } 
    end 
end 
end 

versucht zu tun, wenn ich rufe

User.all 

es gibt mir Arrays in Array meines Benutzer, aber wenn Anruf

User.all.save_to_csv 

es zeigt mir Fehler

<main>': undefined method `save_to_csv' for [["user1"], ["user2"], etc] 

Bitte, helfen, wie es richtig

Antwort

0

User.all gibt ein Array aller instancies von User und seine Attribute, es ist ein Array tun sollten ist, und Sie haben nicht definiert save_to_csv für Array-Objekte.

Sie könnten User.save_to_csv versuchen, das ist die Klassenmethode die CSV-Datei zu öffnen und die Informationen des Benutzers schreiben drauf, aber es gibt ein anderes Problem, es gibt keine @users Variable in der Klasse, so dass es dann den Wert von nil nehmen und Es gibt keine each Methode für nil:NilClass.

Also ich denke, Sie könnten die all Methode verwenden, um auf alle Benutzer zuzugreifen, und dann zu iterieren.

Danach Sie in der CSV-Datei Zeile das Array mit den Daten des Benutzers drücken kann:

def self.save_to_csv 
    CSV.open('users.csv', 'w') do |csv| 
    all.each { |user| csv << user } 
    end 
end 

Hinweis csv.puts wird nicht funktionieren.

+0

Ich denke, ich sollte Methode "alle" ändern, aber nicht verstehen, wie man es richtig macht –

+0

In der "self.save_to_csv" -Methode 'all.each' bezieht sich auf die' self.all' Methode, die 'jede anwendet ', anstatt die Methode stattdessen als' User.all.save_to_csv' aufzurufen, können Sie 'User.save_to_csv' ohne Verkettungsmethoden ausführen. –

Verwandte Themen