Je suis nouveau sur Rails et j'essaie de créer un formulaire d'inscription pour mon site. Cela fonctionne bien, à une exception près: il enregistre les utilisateurs dans la base de données sans vérifier d'abord s'ils existent. Comment puis-je vérifier qu'un utilisateur existe avant de l'enregistrer?
Contrôleur de l'utilisateur:
class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.exists?(:username) == false && @user.save(user_params) session[:id] = @user.id redirect_to posts_path else redirect_to '/signup' end end def edit end def update end def show end def destroy end private def user_params params.require(:user).permit(:username, :jabber_id, :password) end end
4 Réponses :
Utilisez comme ceci dans le fichier de modèle tel que
validates_uniqueness_of :username #=> or specify :email or :name etc...
Le nouveau formulaire est valide: nom d'utilisateur, unicité: vrai
. Les anciennes méthodes validates_X
sont toujours prises en charge mais ne sont pas aussi flexibles que les nouvelles.
Une validation très simple serait quelque chose comme ceci:
# in a migration add_index :users, :username, unique: true
Vous voudrez peut-être ignorer les majuscules et les minuscules:
def create @user = User.new(user_params) if @user.save session[:id] = @user.id redirect_to posts_path else render :new end end
Et changez votre méthode create
en quelque chose comme ceci:
# in your user.rb validates :username, uniqueness: { case_sensitive: false }
De plus, je suggère d'avoir un index unique au niveau de la base de données également:
XXX
Peut également souhaiter ajouter présence: true
.
Il serait également utile d'ajouter un exemple de modification de leur contrôleur. Avec cela, ils n'auront plus besoin de la vérification existe?
car cela devrait générer une erreur de validation lorsqu'ils essaient de sauvegarder.
Comme suggéré, vous devriez utiliser la validation de modèle pour quelque chose comme ça. Cependant, voici pourquoi votre code ne fonctionne pas.
La méthode existe?
doit être utilisée sur la classe de modèle, pas sur une instance de celle-ci, par exemple:
Person.exists?(5) Person.exists?(:name => "David")
Ce qui précède provient du existe? documents
Comme presque les gens vous l'ont suggéré ci-dessus, c'est la meilleure façon d'utiliser l'unicité validation.
Mais si vous voulez essayer avec existe? a> Vous pouvez faire comme,
User.exists? (nom d'utilisateur: params [: nom d'utilisateur])
À quoi ressemble votre modèle utilisateur? Comment définissez-vous qu'un utilisateur quitte déjà - même e-mail, même nom?
Même nom d'utilisateur, même si la syntaxe est peut-être erronée
Vous devez ajouter une validation pour l'unicité de votre modèle comme indiqué ici: guides.rubyonrails.org/… De plus, ajoutez un index unique à votre colonne de nom d'utilisateur au niveau de la base de données via une migration car les validations de Rails ne sont pas une preuve complète en raison des conditions de course.