Simply Getting Post Params


#1

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


#2

if the password field is also associated with user then you can find it
using:
params[:user][:password]


#3

I now see that you are using password_field(“validate_pass”,“pass”) so
you could get this value with:

params[:validate_pass][:password]


#4

Gregory S. 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


#5

On 3/29/06, Gregory S. removed_email_address@domain.invalid 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


#6

Derrick McCray wrote:

Gregory S. 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

Simple 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:

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


#7

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 M.
Informatika Mihelac, Bojan M. s.p. | www.informatikamihelac.com
-> tools, scripts, tricks from our code lab: http://source.mihelac.org