11
votes

Rails - forcer le champ majuscule et validez de manière unique

Les aéroports ont des codes ICAO à quatre lettres. Par convention, celles-ci sont toujours majuscules. Je crée un formulaire pour recevoir une entrée utilisateur, mais ce formulaire doit pouvoir accepter la saisie de l'utilisateur dans des cas mixtes et les empêcher de créer des dupes.

Le Par défaut est cas- sensible, bien sûr. J'ai compris comment transformer l'entrée de l'utilisateur en majuscule avant d'être enregistrée, mais le problème est que cela semble être post-validation, au lieu de la pré-validation.

Par exemple, s'il y a déjà un Aéroport avec ICAO de Klax , un utilisateur peut entrer klax , il sera validé comme unique, puis transformé en majuscules et stockés, entraînant des doublons. < p> Voici mon code modèle à présent. xxx


0 commentaires

4 Réponses :


8
votes

Essayez ceci:

validates :icao, :uniqueness => { :case_sensitive => false }


2 commentaires

ou faire un avant_validation au lieu d'avant_save :)


Parfait, Danny - avant_validation est exactement ce dont j'avais besoin.



2
votes

Simplement corrigé (autant de problèmes de rails sont) - Comme Danny a souligné ci-dessus, bien que pas dans sa propre réponse, je ne peux donc pas l'accepter :), changer avant_save vers avant_validation la corrige parfaitement.


0 commentaires

12
votes

ou une prise légèrement différente: écrire un setter pour ICAO qui convertit tout ce qui les a projetée en majuscule: xxx

et vous pouvez ensuite utiliser une validation régulière d'unicité ( Retourner avec un index unique dans votre DB ) . Peut même rendre les choses un peu plus faciles à faciliter la DB lors de découvertes, car il n'a plus à s'inquiéter de comparaisons insensibles de cas.

espère que cela aide!


1 commentaires

Merci, une façon intéressante de la manipuler aussi. J'ai aussi pour une raison quelconque n'a pas supposé que je devrais indexer mes champs manuellement, c'est très bon à savoir. Facilement fait, mais important! Merci!



5
votes

Réponse mise à jour pour les rails 4.

class Airport < ActiveRecord::Base
  validates :icao, :name, :lat, :lon, :presence => true
  validates :icao, :uniqueness => { case_sensitive: false }

  def icao=(val)
    write_attribute :icao, val.upcase
  end
end


0 commentaires