I am a complete Rails newbie and am trying to understand how I can simply get the data from a password field in a form that is not mapped to a field in the database. The scenario is this. I have a User model that is mapped to a table users with the following fields: username, email_address, password and join_dt. Following pretty closely to the login section in the Agile Web Development with Rails book, the model takes the username, email_address and password (which is hashed before_create()) from the form found in the add_user view. It also makes join_dt = Time.now() in the model. There is an associated add_user action in the login_controller that passes the params to User.new() when a new user is created. My question is that I want the password to be verified and entered twice to ensure the user types the correct password. To do this I thought of adding a password_field("validate_pass","pass") to the form in the view. All the other form helpers are mapped to the "user" object. (i.e. text_field("user", "username"). I then wanted to add a validate method in the User model to check that self.password == this validated password. However, I am not sure how to access the POST parameter in the Model. Can someone please explain to me what I am doing wrong or even if this type of validation should be done in the Model. I thought of adding this validation in the login_controller in the add_user method as well. However, I am a bit confused at how to access this params hash even in the controller. Please help and don''t mind my newbish question if the solution is a bit obvious. Thanks, Derrick -- Posted via http://www.ruby-forum.com/.
if the password field is also associated with user then you can find it using: params[:user][:password] -- Posted via http://www.ruby-forum.com/.
I now see that you are using password_field("validate_pass","pass") so you could get this value with: params[:validate_pass][:password] -- Posted via http://www.ruby-forum.com/.
Gregory Stickley wrote:> I now see that you are using password_field("validate_pass","pass") so > you could get this value with: > > params[:validate_pass][:password]Thanks for your help. Would this be able to be called in the model or do I have to call it in the controller with the add_user action? Derrick -- Posted via http://www.ruby-forum.com/.
On 3/29/06, Gregory Stickley <gstickley@gusto.com> wrote:> I now see that you are using password_field("validate_pass","pass") so > you could get this value with: > > params[:validate_pass][:password]Derrick, to along with what Gregory already wrote you can find the correct "path" to your params by looking in your [railsapp]/log/development.log file. Each request has its parameters recorded like this: Parameters: {"action"=>"foo", "controller"=>"bar", "flintstones" => {"dad" => "fred", "mom" => "wilma"} } Then you can figure out how to access your params. params[:action] params[:flintstones][:dad] etc... -- James
Derrick McCray wrote:> Gregory Stickley wrote: >> I now see that you are using password_field("validate_pass","pass") so >> you could get this value with: >> >> params[:validate_pass][:password] > > Thanks for your help. > > Would this be able to be called in the model or do I have to call it in > the controller with the add_user action? > > DerrickSimple answer: in the controller. Longer answer: When you use text_field("user", "name") or other such rails methods the generated html looks something like this: <input class="textfield" id="user_name" name="user[name]" type="text"> When rails gets a hold of the post/get parameters it turns user[name] and other similarly named fields into a hash and stores it in the params hash so that you can retrieve it like this: user_hash = params[:user] user_hash[:name] ...etc or more simply params[:user][:name] The model classes by extending from ActiveRecord::Base are designed to take one of these hashes as a parameter to their initialize method. This means you can write code like: user = User.new(params[:user]) Though this isn''t the only option. You could also write code like: data = Hash.new data[:name] => "Me" data[:password] => "asdf" ... user = User.new(data) So in one of your actions you could do this: def add_user user = User.new(params[:user]) if user.password != validate(params[:validate_pass][:pass]) flash[:notify] = "Invalid password" else redirect_to :action => some_other_action end end -- Posted via http://www.ruby-forum.com/.
> > My question is that I want the password to be verified and entered twice > to ensure the user types the correct password. To do this I thought of > adding a password_field("validate_pass","pass") to the form in the view. > All the other form helpers are mapped to the "user" object. (i.e. > text_field("user", "username"). I then wanted to add a validate method > in the User model to check that self.password == this validated > password. However, I am not sure how to access the POST parameter in the > Model. >You can use: validates_confirmation_of :text_password in model to check that user entered password twice, and in view: <%= password_field ''user'', ''text_password''%> <%= password_field ''user'', ''text_password_confirmation''%> Access POST parameters with params hash from controller, params[''some_param'']. hope this helps, Bojan -- Bojan Mihelac Informatika Mihelac, Bojan Mihelac s.p. | www.informatikamihelac.com -> tools, scripts, tricks from our code lab: http://source.mihelac.org