2010-12-14 55 views
0

Il compare le mot de passe réel stocké dans la base de données (@ submission.password) avec le mot de passe entré par l'utilisateur à partir de la vue (params [: mot de passe]). S'ils sont égaux, la soumission est supprimée.Rails: Pouvez-vous vérifier la syntaxe pour une méthode de comparaison de chaîne simple?

Ceci est la méthode de comparaison de chaînes.

def compare_password 
    if @submission.password == params[:password] # This line is wrong. 
     @submission = Submission.find(params[:id]) 
     @submission.destroy 
     redirect_to(@submission, :notice => 'Listing deleted successfully') 
    else 
     redirect_to(@submission, :alert => 'Password is incorrect.') 
    end 
end 

Ceci est la vue.

<%form_tag "/submissions/compare_password" do%> 
<%=text_field_tag :password, params[:password]%> 
<%=submit_tag "Delete"%> 
<%end%> 

L'erreur d'exécution que j'obtiens est la suivante.

undefined method `password' for nil:NilClass 

modifier

Initialement mon routes.rb ressemblait à ceci

resources :submissions do 
    collection do 

     post :compare_password 
    end 
end 

Maintenant j'ai changé pour

resources :submissions do 
    member do 

     post :compare_password 
    end 
end 
+0

Conservez-vous des mots de passe dans votre base de données? – Gareth

+0

Oui. Les soumissions ne sont pas stockées dans la base de données de façon permanente et je vais les supprimer chaque semaine. Donc, la perte d'eux n'est pas vraiment un problème. –

Répondre

1

@submission est nul - vous devez trouver cela avant de vérifier la valeur du mot de passe -

def compare_password 
    @submission = Submission.find(params[:id]) # it is nil till you get it here 
    if @submission && (@submission.password == params[:password]) 
     @submission.destroy 
     redirect_to(@submission, :notice => 'Listing deleted successfully') 
    else 
     redirect_to(@submission, :alert => 'Password is incorrect.') 
    end 
end 
+0

Ouais .. Je ne sais pas pourquoi c'est nul, parce que je ne l'ai pas mis à zéro nulle part. J'utilise un échafaudage standard. Sous "def create", je génère aléatoirement le mot de passe "@ submission.password = ActiveSupport :: SecureRandom.hex (16)" –

+0

Ah - Je le vois maintenant - cette ligne '@submission = Submission.find (params [: id]) 'doit être avant la comparaison. –

+0

Je reçois "Impossible de trouver une soumission sans ID". –