2010-10-30 4 views
0

Je construis une petite application dans Rails et ce que j'essaie de faire maintenant est d'authentifier un utilisateur.Problème avec la recherche active d'enregistrements

J'ai eu cette méthode dans la classe du contrôleur:

def login 
     if @user = User.authenticate(params[:txt_login], params[:txt_password]) 
      session[:current_user_id] = @user.id 
      redirect_to root_url 
     end 
    end 

Voici la définition de méthode authenticate (dans la classe modèle utilisateur):

def self.authenticate(username, password) 
     @user = User.where(["username = ? AND password = ?", username, password]) 
     return @user 
    end 

Le problème est que je reçois un message d'erreur dire:

undefined method `id' for #<ActiveRecord::Relation:0x92dff10> 

Je confirme que l'utilisateur que j'essayais de se connecter vraiment exis ts dans la base de données (en plus il essaie d'obtenir l'id d'un utilisateur et cette instruction est enveloppée dans un si 0 cas les utilisateurs sont renvoyés par la méthode d'authentification). Pourquoi est-ce que j'obtiens ce message d'erreur? Sachant que quand je change le User.where par User.find cela fonctionne très bien!

Merci!

Répondre

1

User.where("some_conditions") retourne un tableau d'objets de l'utilisateur (en termes simples), A User.find peut retourner un tableau ou un objet unique. (Je ne suis pas sûr parce que je ne vois pas comment vous l'utilisez)

Pour ce que vous voyez est ActiveRecord :: Relation, c'est ce qui est retourné quand nous appelons une recherche ou une méthode where ou une méthode de commande sur Rails 3 Models.

En outre, vous stockez le mot de passe en tant que chaîne simple, ce qui est une mauvaise idée, vous devez utiliser certains plugins d'authentification de rails disponibles comme Devise ou Authlogic.

+0

Merci. Pour le problème de mot de passe, bien sûr que je suis juste en train de jouer pour apprendre Rails, ce n'est pas un code de production mais je vais probablement jeter un oeil à ces plugins. –

Questions connexes