2016-07-01 15 views
0

I haben die folgende Methode, die Benutzer Geburtstag prüft (in "% d /% m /% Y" -Format) mindestens 18.Rails: Optimierung eines Verfahrens

def person_age 
    if person_birthdate.present? 
     now = Time.now.utc.to_date 
     begin 
     parsedDate = Date.parse(person_birthdate, '%d/%m/%Y') 

     diff = now.year - parsedDate.year 
     diff -= (diff.years.since(parsedDate) > now ? 1 : 0) 

     if diff < 18 
      errors.add :person_birthdate, 'You should be at least 18' 
     end 
     rescue 
     errors.add :person_birthdate, 'Date not valid' 
     end 
    else 
     errors.add :person_birthdate, 'Date not valid' 
    end 
    end 

aber zu viele, wenn die Bedingungen zu sein, Irgendeine Idee, wie man es besser aussehen lässt?

+0

Es scheint, wie Sie den Geburtstag als String in der Datenbank speichern. Warum machst du das? Wenn es eine Datumsspalte wäre, würde Rails das Parsing für Sie übernehmen und Ihre Validierung wäre viel einfacher. – spickermann

Antwort

2

Sie sollten eingebaut und Validierungen benutzerdefinierte verwenden.

validates :person_birthdate, presence: true 
validate :check_age, if: -> { person_birthdate.present? } 

private 

def check_age 
    date = Date.parse(person_birthdate, '%d/%m/%Y') 
    unless d > 18.years.ago 
    errors.add(:person_birthdate, 'message here') 
    end 
end 

if: -> { person_birthdate.present? } erlaubt nur benutzerdefinierte Validierung aufzurufen, wenn die Bedingung true ist.

+0

'allow_nil: true' hindert Sie nicht daran, zu Fehlern zu kommen. 'allow_nil: true' wird nicht benötigt. –

+0

Ja, danke. Ich füge einfach 'if' hinzu. Ich werde die Antwort aktualisieren. – Aleksey

1

Ich denke, was Sie wollen, ist:

validates_presence_of :person_birthdate # which will generate the "Date is required message" 

und so etwas wie:

def person_age 
    date = Date.parse(person_birthdate, '%d/%m/%Y') 
    unless d > 18.years.ago 
    errors.add :person_birthdate, "You should be at least 18."  
    end 
end 
0

Rails ist in einigen Aspekten gut, aber hier alle diese validate[s] sind zuviel des Guten:

def person_age 
    case Date.today - Date.parse(
     person_birthdate, '%d/%m/%Y' 
     ).advance(years: 18) rescue nil 
    when NilClass 
    errors.add :person_birthdate, 'Date not valid' 
    when -Float::INFINITY..0 
    errors.add :person_birthdate, 'You should be at least 18' 
    else puts "Allowed!" 
    end 
end 
Verwandte Themen