2011-06-27 4 views
0

Je souhaite vérifier si un utilisateur existe et, dans l'affirmative, faire correspondre un mot de passe.Impossible de convertir la chaîne en nombre entier dans ruby ​​/ ruby-on-rails

Mon contrôleur ressemble à ceci:

def attempt_login 
    authorized_user = User.authenticate(params[:username], params[:password]) 
    if authorized_user 
     flash[:notice] = "Successfully logged in." 
     redirect_to(:action => 'menu') 
    else 
     flash[:notice] = "Invalid username/password" 
     redirect_to(:action => 'login') 
    end 
end 

Le modèle ressemble:

def self.authenticate(username="", password="") 
    user = User.find_by_username(username) 
    if user && user.password_match?(password) 
     return user 
    else 
     return false 
    end 
end 

def password_match?(password="") 
    hashed_password == User.hash_with_salt(password,salt) 
end 

Dans le processus de le faire, je reçois le TypeError (ne peut pas convertir la chaîne en entier). Je soupçonne que l'erreur se produit lorsque je veux définir une valeur pour authorized_user, mais je ne sais pas comment aborder ce problème.

Editer: Mon journal de serveur est vide. Mais je peux poster le cadre Trace:

activesupport (3.0.8) lib/active_support/descendants_tracker.rb:23:in `delete' 
activesupport (3.0.8) lib/active_support/descendants_tracker.rb:23:in `block in clear' 
activesupport (3.0.8) lib/active_support/descendants_tracker.rb:21:in `each' 
activesupport (3.0.8) lib/active_support/descendants_tracker.rb:21:in `clear' 
railties (3.0.8) lib/rails/application/bootstrap.rb:59:in `block (2 levels) in <module:Bootstrap>' 
activesupport (3.0.8) lib/active_support/callbacks.rb:420:in `_run_call_callbacks' 
actionpack (3.0.8) lib/action_dispatch/middleware/callbacks.rb:44:in `call' 
rack (1.2.3) lib/rack/sendfile.rb:107:in `call' 
actionpack (3.0.8) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
actionpack (3.0.8) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call' 
railties (3.0.8) lib/rails/rack/logger.rb:13:in `call' 
rack (1.2.3) lib/rack/runtime.rb:17:in `call' 
activesupport (3.0.8) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.2.3) lib/rack/lock.rb:11:in `block in call' 
<internal:prelude>:10:in `synchronize' 
rack (1.2.3) lib/rack/lock.rb:11:in `call' 
actionpack (3.0.8) lib/action_dispatch/middleware/static.rb:30:in `call' 
railties (3.0.8) lib/rails/application.rb:168:in `call' 
railties (3.0.8) lib/rails/application.rb:77:in `method_missing' 
railties (3.0.8) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.2.3) lib/rack/content_length.rb:13:in `call' 
rack (1.2.3) lib/rack/handler/webrick.rb:52:in `service' 
E:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service' 
E:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run' 
E:/Ruby192/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' 

Et voici le development.log si elle pouvait aider:

Started POST "/access/attempt_login" for 127.0.0.1 at 2011-06-27 20:19:19 +0200 
DEPRECATION WARNING: config.action_view.debug_rjs will be removed in 3.1, from 3.1 onwards you will need to install prototype-rails to continue to use RJS templates . (called from <top (required)> at G:/Projects/basicsocial/app/controllers/application_controller.rb:1) 
Processing by AccessController#attempt_login as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"jvGVYJEypK9sWoaaa5c2OwzBKmCMX7h7Wp28vBH9wfw=", "username"=>"test88", "password"=>"[FILTERED]", "commit"=>"Log In"} 
<-[1m<-[36mSQL (7.0ms)<-[0m <-[1mdescribe `users_pages`<-[0m 
<-[1m<-[35mSQL (2.0ms)<-[0m SHOW TABLES 
<-[1m<-[36mUser Load (0.0ms)<-[0m <-[1mSELECT `users`.* FROM `users` WHERE `users`.`username` = 'test88' LIMIT 1<-[0m 
Redirected to http://localhost:3000/admin 
Completed 302 Found in 545ms 

TypeError (can't convert String into Integer): 
Rendered E:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms) 
Rendered E:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (5.0ms) 
Rendered E:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (16.0ms) 

La variable salt est ce que j'utilise pour mieux sécuriser la page de mon utilisateur. C'est quelque chose qui est stocké dans la base de données.

+0

Veuillez signaler le retour arrière (ligne sur laquelle l'erreur s'est produite) de l'erreur (doit être présent dans le journal de votre serveur). – Dogbert

+0

Où obtenez-vous l'erreur de type? En passant, dans votre fonction 'password_match?', À quoi fait référence la variable 'salt'? Si vous avez besoin de convertir sur une variable, utilisez simplement '.to_i' pour convertir en Integer et' .to_s' pour convertir en String – vinceh

+0

On dirait que votre 'tentative_login' fonctionne, mais l'erreur se produit quand vous redirigez vers votre La page 'admin', c'est probablement quelque part dans votre vue ou contrôleur pour votre' admin # index' où vous essayez d'utiliser une chaîne comme un entier. – vinceh

Répondre

0

Apparemment, il n'y avait rien de mal avec le code. C'était probablement lié au cache de mon navigateur ou quelque chose de ce genre, car il a commencé à fonctionner le jour suivant. Désolé pour le dérangement.

0

J'ai eu le même problème et j'ai passé des heures à essayer de le réparer. Il est avéré que je l'avais laissé dans une méthode que le tutoriel me avait dit de supprimer quelques vidéos d'avance:

def self.hash(password="") 
    Digest::SHA1.hexdigest(password) 
end 

Dans le tutoriel, cela avait été remplacé par les méthodes

def self.make_salt(username="") 
    Digest::SHA1.hexdigest("Use #{username} with #{Time.now} to make salt") 
end 

def self.hash_with_salt(password="", salt="") 
    Digest::SHA1.hexdigest("Put #{salt} on the #{password}") 
end 

Une fois que je commenté cette méthode, l'erreur est partie. Je ne comprends toujours pas pourquoi cette erreur est apparue en premier lieu. J'ai ajouté une question et plus de détails here.

0

Je veux juste vous faire savoir que j'ai aussi eu ce problème. Le problème a été rapidement résolu mais le serveur a montré l'erreur à chaque demande par la suite. Les modifications de code n'ont pas été prises en compte tant que je n'ai pas redémarré le serveur.

touch tmp/restart.txt n'était pas suffisant, donc j'ai dû redémarrer le serveur /etc/init.d/apache2 restart pour supprimer le message d'erreur.

 
$ apache2 -v 
Server version: Apache/2.2.16 (Debian) 
Server built: Apr 1 2012 07:14:38 

$ ruby -v 
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] 

$ gem list passenger 
*** LOCAL GEMS *** 
passenger (3.0.13) 

$ bundle exec rails -v 
Rails 3.0.7 
Questions connexes