2016-05-30 3 views
2

Validierung zur Zeit ich eine E-Mail-Validierung habe wie folgt:eine Ausnahme machen, wenn E-Mails

validates :email, presence: true, length: { maximum: 255 }, 
      format: { with: VALID_EMAIL_REGEX, message: "Must be your 
      <domain name> email address." }, 
      uniqueness: { case_sensitive: false } 

Dies wird mit einer Ausnahme für alle Benutzer meiner Anwendung arbeiten, ein Admin, die keine E-Mail an die gewünschten Domäne gehört haben und aufgrund der Umstände kann ich keine für ihn schaffen.

Wie kann ich zulassen, dass dieser Administrator ein Konto mit seiner E-Mail-Adresse registriert und die normale E-Mail-Überprüfung umgeht?

Antwort

1

Können Sie Methode mit Validate versuchen zu retten? Siehe here

save (options = {})

Der Validierungsprozess auf, indem Validate übersprungen werden sparen können: false. Die reguläre #save-Methode wird dadurch ersetzt, wenn das Validierungsmodul eingemischt wird, was standardmäßig der Fall ist.

sparen! (Options = {})

Versuche, den Datensatz wie #save zu retten, sondern eine RecordInvalid Ausnahme statt der Rückkehr falsch erhöhen, wenn der Datensatz nicht gültig ist.

Sie können auch diese überprüfen answer

UPD. Wie in Kommentaren angegeben, ist dies für einige (manuelle) Kreationen von Admin-Konten mit deaktivierten Validierungen hilfreich.

+2

Wenn Sie einmal Admin-Datensatz erstellen müssen (z. B. in der Konsole) - das ist gut genug. –

+1

@Nemo, versuchen Sie dies für die erste einmalige Erstellung von Admin-Datensatz, wo Sie erzwingen würde, ohne Validierung für erforderliche Einträge –

+0

Vielen Dank dafür. Ich habe nur eine Ausnahme hinzuzufügen und dies scheint der einfachste Weg zu sein! – Nemo

0

Ich werde etwas tun: false Parameter:

validates :email, presence: true, length: { maximum: 255 }, 
      format: { with: VALID_EMAIL_REGEX, message: "Must be your 
      <domain name> email address." }, 
      uniqueness: { case_sensitive: false }, 
      unless: ->(user) { user.admin? } 
0

Sie können eine Bedingung an die Validierung übergeben, indem Sie :if oder unless verwenden. So etwas wie:

validates :email, presence: true, length: { maximum: 255 }, 
    format: { with: VALID_EMAIL_REGEX, message: "Must be your 
    <domain name> email address." }, 
    uniqueness: { case_sensitive: false }, 
    unless: :admin? 

Sie haben würden, die Methode definieren admin? zu prüfen, ob der Benutzer admin ist oder nicht.

+0

Ich bin neu bei Rails und habe Probleme bei der Implementierung dieser Lösung. Wo definiere ich die 'admin?' Methode? Und würde das funktionieren? Wie kann ich überprüfen, ob ein Benutzer ein Administrator ist, wenn der Benutzer noch nicht erstellt wurde? – Nemo

+0

Angenommen, der Validierungscode ist in Ihrer 'User' Klasse, müssten Sie' admin? 'Als eine Methode von' User' definieren (der Methodenname ist beliebig, Sie können einen beliebigen Namen wählen). Bei dieser Methode müssten Sie die Kriterien für den Administrator festlegen. Dies kann bedeuten, dass das Attribut "admin" für den Benutzer überprüft wird, wenn es eine oder eine andere Lösung wie die von @hieupham gibt, die eine Whitelist verwendet. Um Ihre letzte Frage zu beantworten, werden Validierungen nur auf Instanzen der Klasse/des Modells angewendet. Sie müssen zuerst eine Instanz eines Benutzers erstellen, damit seine E-Mail-Adresse überprüft werden kann (vor dem Speichern in der Datenbank). – mlovic

0

Grundsätzlich gibt es zwei Dinge, für die Validierung erforderlich, wie Sie erwähnt:

  • Validate: uniqueness, length, dies gilt sowohl für admin oder normal user
  • Validate: format, aber außer Admin

Also meine Idee ist, eine Whitelist für Admin zu erstellen:

validates :email, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false } 

validates format: { with: VALID_EMAIL_REGEX, message: "Must be your 
      <domain name> email address." }, unless: :in_admin_whitelist? 

def in_admin_whitelist? 
    email.in? ADMIN_WHITELIST 
end 

Und ADMIN_WHITE_LIST sollte von Umgebungsvariablen

config/initializers/admin geladen werden. rb

ADMIN_WHITELIST = ENV['ADMIN_WHITELIST'].to_s.split(/,/) 

So Ihrem Admin-Whitelist-Wert-Format können Sie in Umgebungsvariable gesetzt werden wie:

[email protected],[email protected] 

Dies wird sicher genug und flexibel sein!

Verwandte Themen