3 Stimmen

Was ist der beste Weg, um mehrere E-Mails zu validieren und Fehler in Rails zu behandeln?

In der aktuellen Anwendung, die ich baue, habe ich ein Textfeld, in das ein Benutzer eine durch Komma getrennte Liste von E-Mail-Adressen eingibt.

Derzeit teile ich die Liste in ein Array auf und speichere sie dann einzeln ab. Aber wenn ich zum Beispiel diese Eingabe habe...

blah@example.com, test@example, foo@example.com

... dann wird blah@example.com gespeichert, aber das Speichern von test@example wird fehlschlagen. Ich muss also blah@example.com aus der kommagetrennten Zeichenkette von Werten entfernen, die ich an das Textfeld zurückgebe, wenn ich die Fehlermeldung anzeige, dass test@example keine gültige E-Mail-Adresse ist.

Gibt es eine bessere Möglichkeit, diese auf der Serverseite zu validieren und Fehler zu behandeln, ohne fancy / hässlich in den Controller zu bekommen?

Vielen Dank im Voraus!

3voto

dstnbrkr Punkte 4265

Angenommen, dies ist ein Modell, das viele E-Mails hat, und das E-Mail-Modell verwendet :validate_email, könnten Sie etwas wie das Folgende tun:

class Foo < ActiveRecord::Base
  validate :must_not_have_invalid_addresses

  ...

  def emails=(addresses)
    @invalid_addresses = []
    addresses.split(",").each do |address|
      @invalid_addresses.push(address) unless emails.create({:address => address})
    end
  end

  def must_not_have_invalid_addresses
    errors.add_to_base("Some email addresses were invalid") unless @invalid_addresses.empty?
  end

end

Dies liefert einen Validierungsfehler und ein Array mit den ungültigen E-Mail-Adressen, die Sie Ihrer Ansicht zugänglich machen können, wenn Sie möchten.

0voto

Steven Evers Punkte 15926

Ruby hat eine Split-Funktion (.each), die beschrieben wird aquí und unterstützt reguläre Ausdrücke wie beschrieben aquí

als solches würden Sie die Zeichenfolge aufteilen (mit "," als Trennzeichen) und dann den regulären Ausdruck verwenden, um jede E-Mail zu überprüfen.

0voto

klew Punkte 14589

Sie können speichernde E-Mails in die Transaktion aufnehmen. Wenn dann ein Speichervorgang fehlschlägt, werden alle vorherigen Speichervorgänge abgebrochen. In diesem Fall können Validierungen nur auf Modellebene durchgeführt werden.

Ich denke, es wäre klar, Code, aber sicher ist es nicht der schnellste Weg möglich (aber mit Ruby bedeutet, dass Sie nicht tun, es in auch schnelle Weise ;) )

-1voto

vrish88 Punkte 18253

Wenn Sie sie in einer Variablen namens emails kann vielleicht etwas in dieser Art funktionieren:

  if valid_emails?(emails)
      # then have your normal logic here
      if @user.save
           flash[:notice] .....

      end
  end

  private
     def valid_emails?(emails)
        not emails.find {|email| email =~ /[\w\.%\+\-]+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)/i }.nil?
     end

EDIT: Eigentlich sollten Sie nur diesen regulären Ausdruck verwenden. Er stammt aus dem restful-authentication Plugin.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X