validates_length_of virtual attribute

Hi all,

I have in my Person model a attribute named "hash" which is a hash of a
password and a salt.
When a user want to create a account of update it, he just have to
specify its password in a password virtual attribute. To do so, I use
this code:

  # in model
  class Person < ActiveRecord::Base
    validates_length_of :password, :within => 6..40
    def password
    end
  end

  # in view
  <p>Password <%= f.password_field :password %></p>

But when I try to create a account for testing, I get an error message
from the model that said my password is so short (less then 6 chars)...
even if my password got more chars. I don't understand why.

Thanks for any help.
D.

Think about what happens: the validation runs, and tries to get the password to see if you've set it to at least 6 characters. It calls the password method, which returns nil so the validation fails. Your password accessor needs to return the value set by the form (you could just use attr_accessor).

Fred

Frederick Cheung wrote:

Think about what happens: the validation runs, and tries to get the
password to see if you've set it to at least 6 characters. It calls
the password method, which returns nil so the validation fails. Your
password accessor needs to return the value set by the form (you could
just use attr_accessor).

Fred

Thank you for your answer. By using attr_accessor :password, my password
attribute can be read and write.

But I have a thin other problem because of my special write attribute:

def password=(password)
  self.salt = salt = Digest::SHA1.hexdigest(Time.now.to_s)
  self.shadow = Digest::SHA1.hexdigest(password + salt)
end

Do you think there is a way to solve it by modify this method and just
remplace attr_accessor :password by attr_reader :password?

Thanks again for your help.
D.

Frederick Cheung wrote:

Think about what happens: the validation runs, and tries to get the
password to see if you've set it to at least 6 characters. It calls
the password method, which returns nil so the validation fails. Your
password accessor needs to return the value set by the form (you
could
just use attr_accessor).

Fred

Thank you for your answer. By using attr_accessor :password, my
password
attribute can be read and write.

But I have a thin other problem because of my special write attribute:

def password=(password)
self.salt = salt = Digest::SHA1.hexdigest(Time.now.to_s)
self.shadow = Digest::SHA1.hexdigest(password + salt)
end

Do you think there is a way to solve it by modify this method and just
remplace attr_accessor :password by attr_reader :password?

Well you need the password method to work, so something like

def password=(password)
   @password = password
   # rest of your method here
end

Fred

Frederick Cheung wrote:

def password=(password)
   @password = password
   # rest of your method here
end

Fred

Oops, I haven't thinking of this... Now that's okay,
Thanks a lot!