I want to create a model validation that ensures that the two passwords
entered on the password creation page are equivalent. Sure I could put
this into my controller but that wouldn''t be as clean. So I created two
attributes in my model for the hashed password entries...
password_hash and password1_hash...
then I created a custom validation called validates_equality_of that
takes three arguments - the two attributes to compare and a descriptor
of what those attributes are for the error code.
Now I think I''m a genius...only problem is when the validator executes
I get a run time error stating that my ''errors'' variable is
undefined...this should not happen. Can someone look at this snippet of
code and tell me what I''ve done wrong?
require ''digest/sha2''
require ''rubygems''
require ''breakpoint''
require ''logger''
module ActiveRecord
module Validations
module ClassMethods
def validates_equality_of(attr1, attr2, description)
$LOG.debug( "In validates_equality_of") if $LOG != nil
raise "description must be a string" if !description.is_a?(
String)
if ( attr1 != attr2)
$LOG.debug( "attributes not the same") if $LOG != nil
errors.add( attr2, "Both " + description + " must be
the
same")
else
$LOG.debug( "Attributes the same") if $LOG != nil
end
end
end
end
end
class User < ActiveRecord::Base
validates_uniqueness_of :username
validates_equality_of :password_hash, :password1_hash, "passwords"
def self.authenticate( username, password)
user = User.find( :first, :conditions => [''username =
?'',
username])
if user.blank? ||
Digest::SHA256.hexdigest(password + user.password_salt)
!user.password_hash
raise "Username or Password invalid"
end
user
end
def password=(pass)
$LOG.debug( "in password=")
if !self.password_salt
salt =
[Array.new(6){rand(256).chr}.join].pack(''m'').chomp
self.password_salt, self.password_hash = salt,
Digest::SHA256.hexdigest(pass + salt)
else
self.password_hash = Digest::SHA256.hexdigest(pass +
self.password_salt)
end
end
def password1=(pass)
$LOG.debug( "in password1=")
if !self.password_salt
salt =
[Array.new(6){rand(256).chr}.join].pack(''m'').chomp
self.password_salt, self.password1_hash = salt,
Digest::SHA256.hexdigest(pass + salt)
else
self.password1_hash = Digest::SHA256.hexdigest(pass +
self.password_salt)
end
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---
Can I ask why you''re not using built in validates_confirmation_of? Also check out the LoginEngine, the code should help. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 GreenRuby wrote:> I want to create a model validation that ensures that the two passwords > entered on the password creation page are equivalent. Sure I could put > this into my controller but that wouldn''t be as clean. So I created two > attributes in my model for the hashed password entries... > > password_hash and password1_hash... > > then I created a custom validation called validates_equality_of that > takes three arguments - the two attributes to compare and a descriptor > of what those attributes are for the error code. > > Now I think I''m a genius...only problem is when the validator executes > I get a run time error stating that my ''errors'' variable is > undefined...this should not happen. Can someone look at this snippet of > code and tell me what I''ve done wrong?You are saying ''errors.add( ... )''. You haven''t defined errors as a local variable so ruby is thinking you are calling a method. You need to say @errors.add( ... )'' Zach -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFE86f/Myx0fW1d8G0RAkSlAJ95y8Ft2Fu7L3PIg6Rk8LoggH4LsgCcDz/I JPLuZhul7vqSFPjFFtgKqU8=8x2g -----END PGP SIGNATURE----- --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 - From my last post, rather the trying @errors.add( ... ) try: record.errors.add( ... ) Zach -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFE86lLMyx0fW1d8G0RArNJAJ9mhIcNkQuheho43ePhBGDM996iNgCfXncJ HqlmyRKwWmNFWywUiiP/3tA=gLye -----END PGP SIGNATURE----- --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
zdennis - that does not work - record is also not defined... from what I can tell all the calls you can use to get a record in scope only work with one attribute at a time... Still wondering... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Jonathan,,,you have a very good point...why is that not called validates_password or something equivalent... I''m still interested in why my code doesn''t work... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
GreenRuby wrote:> Jonathan,,,you have a very good point...why is that not called > validates_password or something equivalent... > > I''m still interested in why my code doesn''t work...Your code doesn''t work because it''s being run in the wrong context. You''re defining a class-level method that needs to be run in the instance context. The validates_* methods don''t actually run the validation code - they generate code to be run when valid? is called. Basically, your method, instead of checking the record''s attributes and adding an error, should add a hook to be called on validation. You could do: validate do |record| record.errors.add(attr1, message) unless record.send(attr1) =record.send(attr2) end However, this sort of breaks the convetions the Rails validations tend to use, and isn''t really configurable. Have a look at validations.rb in the ActiveRecord source if you want to see how validations work. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---