2016-05-06 12 views
0

mit fragen, ich für die Benutzereingabe fragen wollen, aber ich will es nur einmal tun (möglicherweise die Informationen innerhalb des Programms speichern), das heißt, so etwas wie diese:Erkundigung Benutzer Informationen, und nie wieder

print "Enter your name (you will only need to do this once): " 
name = gets.chomp 

str = "Hello there #{name}" #<= As long as the user has put their name in the very first 
# time the program was run, I want them to never have to put thier name in again 

Wie kann ich innerhalb eines Ruby-Programms dazu kommen?

Dieses Programm wird von mehreren Benutzern im Laufe des Tages auf mehreren Systemen ausgeführt. Ich habe versucht, es im Speicher zu speichern, aber offensichtlich ist das fehlgeschlagen, weil ich davon überzeugt bin, dass der Speicher jedes Mal gelöscht wird, wenn ein Ruby-Programm nicht mehr ausgeführt wird.

Meine Versuche:

def capture_user 
    print 'Enter your name: ' 
    name = gets.chomp 
end 
#<= works but user has to put in name multiple times 

def capture_name  
    if File.read('name.txt') == '' 
    print "\e[36mEnter name to appear on email (you will only have to do this once):\e[0m " 
    @esd_user = gets.chomp 
    File.open('name.txt', 'w') { |s| s.puts(@esd_user) } 
    else 
    @esd_user = File.read('name.txt') 
    end 
end 
#<= works but there has to be a better way to do this? 

require 'tempfile' 

def capture_name 
    file = Tempfile.new('user') 
    if File.read(file) == '' 
    print "\e[36mEnter name to appear on email (you will only have to do this once):\e[0m " 
    @esd_user = gets.chomp 
    File.open(file, 'w') { |s| s.puts(@esd_user) } 
    else 
    @esd_user = File.read(file) 
    end 
end 
#<= Also used a tempfile, this is a little bit over kill I think, 
# and doesn't really help because the users can't access their Appdata 
+4

Ihre Frage ist verfrüht. Was hast du probiert? Warum hat es nicht funktioniert? Wenn Sie es nicht versucht haben, warum nicht? Ihr Beispiel zeigt keinen Versuch, und das müssen wir sehen. Bitte lesen Sie "[ask]" einschließlich der Links auf dieser Seite und "[mcve]". Wie auch immer, du fragst nach einem Tutorial, aber wir haben keine Ahnung, was dein Fachwissen ist, also müssen wir von ganz unten beginnen und uns aufarbeiten, was nicht zum Thema gehört. Mehrere Benutzer/Zeiten? Aus verschiedenen Systemen? Von einem System? Browser verwenden? Von der Befehlszeile? Es gibt viele fehlende Informationen. –

+0

@theTinMan Wie ist das? – 13aal

+0

Es ist eine Verbesserung. Sind die Informationen, die gespeichert werden, nur für die Person nützlich, die auf dieser Maschine gespeichert ist, oder ist sie für alle Benutzer auf allen Maschinen nützlich? Der Grund dafür ist, dass das Speichern einer Datei nur für eine Person auf einem bestimmten Computer von Vorteil ist. Wenn Sie die Informationen teilen müssen, müssen Sie ein gemeinsames Datenrepository verwenden, normalerweise eine Datenbank. –

Antwort

1

Sie möchten den Benutzernamen in einer Datei im lokalen Dateisystem speichern. Ruby bietet viele Möglichkeiten, dies zu tun, und wir werden eine in dieser Antwort untersuchen: YAML-Dateien.

YAML-Dateien sind eine strukturierte Speicherdatei, die alle Arten von unterschiedlichen Daten speichern kann, und ist ein guter Ort, um Konfigurationsdaten zu speichern. Tatsächlich sind YAML-Konfigurationsdateien Schlüsselelemente der größten bestehenden Ruby-Projekte. YAML gibt Ihnen einen guten Ausgangspunkt, um zukünftige Konfigurationsanforderungen zu unterstützen, die über die aktuelle hinausgehen. Dies ist eine großartige Möglichkeit, die Feature-Entwicklung zu planen.

Also, wie funktioniert es? Lassen Sie uns einen Blick auf Ihre Anforderung finden YAML config:

require 'yaml' 

config_filename = "config.yml" 
config = {} 
name = nil 

if file_exists(config_filename) 
    begin 
    config = YAML.load_file(config_filename) 
    name = config["name"] 
    rescue ArgumentError => e 
    puts "Unable to parse the YAML config file." 
    puts "Would you like to proceed?" 
    proceed = gets.chomp 

    # Allow the user to type things like "N", "n", "No", "nay", "nyet", etc to abort 
    if proceed.length > 0 && proceed[0].upcase == "N" 
     abort "User chose not to proceed. Aborting!" 
    end 
    end 
end 

if name.nil? || (name.strip.length == 0) 
    print "Enter your name (you will only need to do this once): " 
    name = gets.chomp 

    # Store the name in the config (in memory) 
    config["name"] = name 

    # Convert config hash to a YAML config string 
    yaml_string = config.to_yaml 

    # Save the YAML config string to the config file 
    File.open(config_filename, "w") do |out| 
    YAML.dump(config, out) 
    end 
end 

Rather Sie als zeigen das Nötigste Ihren Bedürfnissen gerecht zu werden, enthält dieser Code ein wenig Fehlerbehandlung und einige einfache Sicherheitsüberprüfungen auf der Konfigurationsdatei. Es ist möglicherweise robust genug für Sie sofort zu verwenden.

Das allererste Bit erfordert nur die YAML-Standardbibliothek. Dadurch funktionieren die YAML-Funktionen in Ihrem Programm. Wenn Sie eine Loader-Datei oder einen anderen üblichen Mechanismus haben, legen Sie einfach die require 'yaml' dort.

Danach initialisieren wir einige Variablen, die in diesem Prozess verwendet werden. Sie sollten beachten, dass die config_filename keine Pfadinformationen enthält, so dass es aus dem aktuellen Verzeichnis gelesen wird. Wahrscheinlich möchten Sie die Konfigurationsdatei an einem gemeinsamen Ort speichern, z. B. in ~/.my-program-name/config.yml oder C:\Documents and Settings\MyUserName\Application Data\MyProgramName\. Dies kann ziemlich einfach gemacht werden, und es gibt viel zu helfen, wie diese Location to Put User Config Files in Windows und Location of ini/config files in linux/unix.

Als nächstes prüfen wir, ob die Datei tatsächlich existiert, und wenn ja, versuchen wir, den YAML-Inhalt daraus zu lesen. Die Methode YAML.load_file() behandelt alle schweren Lasten hier, also müssen Sie nur den Config-Hash fragen, der für den Schlüssel zurückgegeben wird, an dem Sie interessiert sind, in diesem Fall der Schlüssel "name".

Wenn beim Lesen der YAML-Datei ein Fehler auftritt, deutet dies darauf hin, dass die Datei möglicherweise beschädigt ist. Daher versuchen wir, damit umzugehen. YAML-Dateien lassen sich leicht von Hand bearbeiten, aber wenn Sie das tun, können Sie auch leicht einen Fehler einführen, der das Laden der YAML-Datei zum Scheitern bringt. Der Fehlerbehandlungscode ermöglicht es dem Benutzer, das Programm abzubrechen und die YAML-Datei wiederherzustellen, so dass sie nicht einfach überschrieben wird.

Danach versuchen wir zu sehen, ob wir einen gültigen Namen von der YAML-Konfig hatten, und wenn nicht, wir gehen voran und akzeptieren es vom Benutzer. Nachdem sie einen Namen eingegeben haben, fügen wir sie zum Konfigurationshash hinzu, konvertieren den Hash in eine YAML-formatierte Zeichenfolge und schreiben diese Zeichenfolge dann in die Konfigurationsdatei.

Und das ist alles, was es braucht. Alles, was Sie in einem Ruby-Hash speichern können, können Sie in einer YAML-Datei speichern. Das ist eine Menge Energie zum Speichern von Konfigurationsinformationen. Wenn Sie später weitere Konfigurationsoptionen hinzufügen müssen, verfügen Sie über einen vielseitigen Container, den Sie genau für diesen Zweck verwenden können.

Wenn Sie weiter lesen auf YAML tun möchten, können Sie einige gute Informationen finden Sie hier:

Während einige dieser Artikel sind ein bisschen älter, sie sind immer noch sehr relevant und geben Ihnen einen Sprungpunkt für weitere Lektüre. Genießen!

+0

Dies ist wahrscheinlich eine der besten Antworten, die ich je gesehen habe. – 13aal

1

Wenn Sie den Namen müssen über den Benutzer beharren das Skript mehrmals ausgeführt wird, Sie gehen zu verwenden, brauchen eine Art von Datenspeicher. So sehr ich flache Dateien hasse, wenn alles, was Sie speichern, der Name des Benutzers ist, denke ich, dass dies eine gültige Option ist.

if File.exist?('username.txt') 
    name = File.open('username.txt', 'r') do |file| 
     name = file.gets 
    end 
else 
    print "Enter your name (you will only need to do this once): " 
    name = gets.chomp 

    File.open('username.txt', 'w') do |file| 
     file.puts name 
    end 
end 
str = "Hello there #{name}" 
+0

Wie würde das funktionieren? Dieses Programm wird mehrmals im Laufe des Tages ausgeführt, ich möchte, dass sie ihren Namen _once_ eingeben müssen und es nie wieder tun müssen. Diese Lösung würde erfordern, dass der Benutzer ihren Namen jedes Mal eingibt, wenn das Programm ausgeführt wird. – 13aal

+1

Sie sollten diese Dinge in Ihrer Frage angeben. Sie haben nichts über das mehrfache Ausführen des Skripts gesagt, nur dass Sie nicht mehrmals nach ihrem Namen fragen wollten - ich nahm an, dass das in einer Art Schleife lief. Um zu tun, was Sie tun möchten, werden Sie eine Art von Datenspeicher benötigen. Ich werde meine Antwort bearbeiten, um Ihnen zu zeigen, worüber ich rede. – erahm

+0

Ich sehe, das ist, was ich dachte, aber ich war mir nicht sicher, ob es eine Möglichkeit gab, es in Ruby-Speicher zu tun. – 13aal

Verwandte Themen