validates :username, exclusion: { in: %w(about account root etc..)

Ich verwende das oben Gesagte, um Benutzern die Verwendung reservierter Benutzernamen zu verbieten, aber sie können sie weiterhin zwischen Unterstrichen verwenden (ich erlaube Unterstriche in Benutzernamen).

Kann ich den reservierten Benutzernamen trotzdem durch Rails validieren lassen, auch wenn er vor oder nach einem Unterstrich steht?

Vielen Dank

0
ukeagle 29 Dez. 2015 im 22:23

3 Antworten

Beste Antwort

Sie können eine Methode erstellen, um Ihre Validierungen für Sie durchzuführen, und dabei einfachen alten Rubin verwenden. Wie Sie in den Dokumenten hier sehen können

Das würde für Sie ungefähr so aussehen:

  validate :my_validation_method

  def my_validation_method
    errors.add(:username, :exclusion) if some_condition
  end

Dies bedeutet, dass das Modell mit my_validation_method sowie all Ihren normalen anderen Validierungen validiert werden muss. Anschließend fügen Sie das fehlerhafte Feld (in Ihrem Fall: Benutzername) manuell zu den Fehlern des Modells hinzu, sodass die Validierung fehlschlägt.

Beachten Sie auch validate anstelle von validates.

Ihre andere Frage ist im Grunde, wie Sie überprüfen können, ob ein eingegebener Wert einige Wörter enthält. Sie könnten dies so machen:

def my_validation_method
   forbid = %w(luke darth artoo fry bender)

   errors.add(:username, :exclusion) if forbid.find { |w| username.include?(w) }
end

Hier habe ich eine Bedingung zum Hinzufügen des Fehlers hinzugefügt, bei der wir jedes Wort in der verbotenen Liste durchlaufen und prüfen, ob der Benutzername dieses Wort enthält. Beachten Sie, dass "blablaluke" auch scheitern würde! Es ist also nicht ganz das, was Sie wollen. Aber damit können Sie natürlich selbst herumspielen.

Der Normalisierungsgrad, den Sie durchführen (z. B. das Entfernen anderer Zeichen), kann Ihnen mehr Kontrolle geben, z. B. das Verhindern von ad_min usw.

Update: Sie können Zeichen wie folgt entfernen:

username.tr('-_+$^&', '')

Sie können dieser ersten Zeichenfolge in tr hinzufügen, was Sie entfernen möchten.

2
Mosselman 29 Dez. 2015 im 20:03

Gemäß den Rails-Dokumenten können Sie auf diese Weise nur überprüfen, ob sich ein Wert in einem Satz von befindet gegebene Werte.

Dieser Helfer überprüft, ob die Werte der Attribute nicht in einem bestimmten Satz enthalten sind.

Ich würde nur eine benutzerdefinierte Validierungsmethode schreiben Methode - Sie können dort tun, was Sie wollen .

1
srecnig 29 Dez. 2015 im 19:46

Ich würde wahrscheinlich einen Regex verwenden. Wie dieser:

validates_format_of :username, :with => /\A(([ _]*)(?!(about|admin|root|etc)[ _])[^ _]+)+([ _]+|\z)\z/
0
Rob 29 Dez. 2015 im 20:45