JeuWeb - Crée ton jeu par navigateur
[Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? (/showthread.php?tid=5689)

Pages : 1 2


[Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - popayan - 13-09-2011

Bonjour,

J'ai commencé le développement d'un jeu (que je présenterai d'ici quelques semaines) et je pense que je vais me heurter à pas mal de soucis divers et variés.

Donc au lieu de polluer avec 10 000 threads, j'en ouvre un où je viendrais poser mes petites questions....

Question 1 :

Quelles pourraient être les raisons pour qu'un "validates_confirmation_of" ne fonctionne pas?

extrait de code:


class User < ActiveRecord::Base

attr_accessor :password, :password_confirmation

validates_presence_of :email, :password, :password_confirmation
validates_uniqueness_of :email
validates_confirmation_of :password_confirmation
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
validates :password, :length => { :in => 5..30 }
end


class UsersController < ApplicationController
def register
@user = User.new
if request.post?
@user = User.new(params[:user])
if @user.valid?
...
end
end
end
end


<h1><%= t('register_you') %></h1>

<%= form_for @user, :url => { :action => "register" } do |f| %>
<p><%= f.label :email %>
<%= f.text_field :email %>
<% if !@user.errors[:email].empty? %> <span class='error_message'><ul>
<% @user.errors[:email].each do |msg| %>
<li><%= msg %></li>
<% end %></ul></span>
<% end %>
</p>
<p><%= f.label :password %>
<%= f.password_field :password %>
<% if !@user.errors[:password].empty? %> <span class='error_message'><ul>
<% @user.errors[:password].each do |msg| %>
<li><%= msg %></li>
<% end %></ul></span>
<% end %>
</p>
<p><%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %>
<% if !@user.errors[:password_confirmation].empty? %> <span class='error_message'><ul>
<% @user.errors[:password_confirmation].each do |msg| %>
<li><%= msg %></li>
<% end %></ul></span>
<% end %>
</p>
<%= f.submit "Create" %>
<% end %>

<%= debug @user.errors %>

Pour info, les autres règles de validation fonctionnent...


RE: Mes questions à la con sur Rails (ep 1) - Sephi-Chan - 13-09-2011

Bouh ! Tu n'as même pas été voir la documentation de validates_confirmation_of ! :p Tu dois juste faire :


validates_confirmation_of :password

Je préférerais que tu crée un topic par question. Ça aura comme effet bénéfique de ne pas poser des questions sans te documenter un minimum.

Et à ceux qui se testent Rails, vous avez raison ! Ça fait du bien de voir d'autres choses que PHP. Smile


RE: Mes questions à la con sur Rails (ep 1) - popayan - 13-09-2011

oh que si, j'ai été la voir plus d'une fois! Là, c'est quand même la loose totale de pas avoir vu çà!

[mode Jospin]Vu le niveau affiché sur ce coup là, je me demande si je devrais pas me retirer définitivement de la programmation Smile[/mode Jospin]

Sephi, à la limite, vu que ca n'apporte rien de bien intéressant, peux-tu supprimer ce thread?


RE: Mes questions à la con sur Rails (ep 1) - niahoo - 13-09-2011

non toute ta famille, tes amis et tes collègues pourront venir se reccueillir sur ce thread et se moquer de toi quand tu sera parti élever des pingouins à l'île de Ré, dégoûté de la programmation. Ce thread doit rester.

Par contre, juste un truc qui me parrait bizzare sur Rails là:
ActiveRecord::Base c'est une classe qui gère la couche modèle nan ? Donc User c'est un modèle. Alors c'est bizzare qu'il gère la confirmation du password et surtout qu'il en requière la présence. Car la confirmation n'est pas stocké, donc quand tu récup ton User dupuis une DB, y a pas de confirmation.

Donc dites mois comment ça marche :+)


RE: Mes questions à la con sur Rails (ep 1) - Sephi-Chan - 13-09-2011

Non car il y a d'autres choses à dire sur ton code. Des mauvaises choses !!!



class UsersController < ApplicationController
def register
@user = User.new
if request.post?
@user = User.new(params[:user])
if @user.valid?
...
end
end
end
end

Tu te crois en PHP là, à tester si la requête est en POST ? Avec Rails tu devrais plutôt avoir une action pour l'affichage du formulaire et une action pour le traitement du formulaire. Pas de 2 en 1.



class UsersController < ApplicationController
def create
@user = User.new(params[:user])

if @user.save
redirect_to root_path
else
render :new
end
end


def new
@user = User.new
end
end



(13-09-2011, 11:57 AM)niahoo a écrit : Par contre, juste un truc qui me parrait bizzare sur Rails là:
ActiveRecord::Base c'est une classe qui gère la couche modèle nan ? Donc User c'est un modèle. Alors c'est bizzare qu'il gère la confirmation du password et surtout qu'il en requière la présence. Car la confirmation n'est pas stocké, donc quand tu récup ton User dupuis une DB, y a pas de confirmation.

Le validateurs validates_presence_of valide que quand on sauvegarde l'objet et que l'attribut donné change, sa confirmation — qui n'existe effectivement qu'en mémoire — est présente et contient la même valeur.




RE: [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - niahoo - 13-09-2011

Donc techniquement si tu veux modifier ton compte en changeant par exemple l'addresse de ton profil ou blog, tu dois passer aussi le mot de passe (ok) et sa confirmation (inutile) ?

Ou alors tu hack ton controlleur en lui passant le champ mot de passe dans le mdp *et* dans la confirm ?

Ou est l'astuce


RE: [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - Sephi-Chan - 13-09-2011

Non, Rails utilise le mécanisme de Dirty. Tu peux savoir si un attribut a changé et dans quelle mesure il a changé (grâce aux méthodes password_changed? et password_changes, ou plus généralement changes).

Ainsi, si je change seulement l'email, il ne va pas vérifier le mot de passe. Mais si je change le mot de passe, alors il va vérifier que la confirmation est présente et a la même valeur.


RE: [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - popayan - 13-09-2011

Je vais répondre pour le "request.post?" (je suis certainement (encore) à coté de la plaque mais bon...) :
-> Je veux avoir sur ma page d'accueil 2 formulaires : celui d'inscription et celui de connexion
-> S'il y a une erreur pdt la saisie d'un des formulaires, l'utilisateur est redirigé vers la page spécifique au formulaire (par exemple /register) et on affiche les erreurs sur cette page.
...
-> En essayant d'expliquer, je me rends compte que ce n'est plus très clair dans mon esprit... :/ Je me souviens que cette "astuce" permettait de me sortir d'un problème mais je ne me souviens plus duquel...


RE: [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - niahoo - 13-09-2011

Ok ! Thx


RE: [Rails] Pourquoi ce validates_confirmation_of ne fonctionne pas ? - popayan - 13-09-2011

pour répondre à niahoo : tu peux ajouter une option " : on => :create " (sans l'espace entre le : et le o, saleté de smiley...) sur la validation, ce qui permet de passer outre cette validation pour un update par exemple