1
votes

"existe?" la méthode ne fonctionne pas - essayez de vérifier si un utilisateur existe avant d'enregistrer dans la base de données

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


3 commentaires

À 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.


4 Réponses :


1
votes

Utilisez comme ceci dans le fichier de modèle tel que

validates_uniqueness_of :username #=> or specify :email or :name etc...


1 commentaires

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.



4
votes

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


2 commentaires

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.



0
votes

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


0 commentaires

0
votes

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? Vous pouvez faire comme,

User.exists? (nom d'utilisateur: params [: nom d'utilisateur])


0 commentaires