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.