2017-10-13 4 views
0

Ich bin ein Neuling auf Schienen und ich brauche deine Hilfe zu diesem Thema.Rubin Datum Validierung auf falschen Eingang

Wenn im folgenden Code die erste Eingabe falsch ist und die zweite korrekt ist, wertet der Ausdruck die erste Eingabe aus. Ich möchte, dass die Benutzereingabe immer ausgewertet wird.

require 'date' 

puts "x is not a valid date" 
until (x = gets.chomp) == ((x.match(/\d{4}-\d{1,2}-\d{1,2}$/).to_s &&Date.strptime(x, '%Y-%m-%d')rescue false) ==true) 
+0

ty für die Eingabe, einen gewissen Wert sein viel –

Antwort

1

Im Allgemeinen sollten Sie versuchen, um Ihre Data-In-Logik von der Datenvalidierung und späteren Verarbeitung zu trennen. Auf diese Weise beschäftigen sich Ihre Methoden jeweils nur mit einer Sache, wodurch sie viel einfacher zu verstehen und damit robuster sind.

Hier stellen wir eine valid_date_string? Methode vor, die prüft, ob das übergebene input Objekt eine gültige Datumszeichenkette ist.

require 'date' 

def valid_date_string?(input) 
    # First, we check that the given input is of the expected type. 
    # We do this here explicitly since we are validating a String. Most 
    # of the time, you would rely on duck typing instead. 
    return false unless input.is_a?(String) 

    # Then, we ensure roughly valid syntax (i.e. it looks like a date) 
    return false unless input =~ /\A\d+-\d+-\d+\z/ 

    # Then, we "parse" it and split it into an array of year, month, day... 
    parts = input.split('-').map(&:to_i) 
    # ...and validate that this represents a valid date 
    Date.valid_date?(*parts) 
end 

In dieser Lösung passte ich auf Ausnahmen für Programmablauf verlassen nicht, da dies in der Regel verpönt ist, wie es in unentdeckten Fehlern führen kann und ein schlechte Leistung.

Wir haben dann diese Methode in einem gewissen Eingangsschleife verwenden, um den Benutzer zur Eingabe von

def get_valid_date 
    loop do 
    input = gets.chomp 
    return input if valid_date_string?(input) 

    # Here, the user entered an invalid date. We can now do our 
    # error handling and try again. 
    puts "Invalid date given. Please try again..." 
    end 
end 

my_valid_date_string = get_valid_date 
+1

Ehrlich gesagt haben Sie eine bessere Lösung bereitgestellt +1 – mabe02

+0

danke @Holger! Das hat mir geholfen, mehr Dinge zu klären! –

0

Ich würde dieses Problem Ansatz wie folgt:

# date_test.rb 

def date_input 
    puts "Please enter a date (format YYYY-MM-DD):" 
    d = gets.chomp 
    if d =~ /\d{4}-\d{1,2}-\d{1,2}$/ 
    puts "You entered: #{d}" 
    else 
    puts "#{d} is not a valid date." 
    date_input 
    end 
end 

date_input 

Erläuterung:

  • prompt ein Datum (unter Angabe der erwarteten Format)
  • bekommt und chomp die Eingabe des Benutzers eingeben
  • validieren Sie das Format
    • wenn gültig, setzt das Datum
    • wenn nicht gültig ist, setzt den Fehler und starten wieder

Wenn Sie es ausführen:

$ ruby date_test.rb 
Please enter a date (format YYYY-MM-DD): 
invalid date 
invalid date is not a valid date. 
Please enter a date (format YYYY-MM-DD): 
2017-10-13 
You entered: 2017-10-13 
$ 
+0

Danke geschätzt zu fragen @ mabe02, sieht der Code wie unten und validiert das Datumsformat und ein vorhandenes Datum: erfordern 'Datum' def Datumseingang puts "Bitte geben Sie ein Datum ein (Format YYYY-MM-DD):" d = gets.chomp if (d = ~/\ d {4 } - \ d {1,2} - \ d {1,2} $/&& Datum.strptime (d, '% Y-% m-% d') Rettung falsch) puts "Sie haben Folgendes eingegeben: # {d} " sonst puts "# {d} ist kein gültiges Datum." date_input Ende Ende date_input –

+0

Hey @GeorgeConstantin, haben Sie diese Antwort nützlich gefunden? Löst es deine Frage? Wenn nicht, können Sie mir sagen, wie es verbessert werden kann, um akzeptiert zu werden? – mabe02

+0

Hey, @ mabe02, ja es war sehr nützlich, danke –