# Noob question .each problem

**URL:** <https://discuss.rubyonrails.org/t/noob-question-each-problem/48321>\
**Category:** rubyonrails-talk\
**Created:** [January 3, 2010, 4:50pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321 "2010-01-03T16:50:38Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Frederick\_Cheung](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/frederick_cheung/32/3901_2.png) [@Frederick\_Cheung](https://discuss.rubyonrails.org/u/Frederick_Cheung)\
**Post date:** [January 3, 2010, 4:50pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/1 "2010-01-03T16:50:38Z")

</div>

This is somewhat unwieldy - why the busines with index when you could just return correct\_user ? Even better, use a method like detect - the code above is equivalent to user.detect {|current\_user| current\_user == User.encrypt(password, current\_user)} You'll also find your code reads more easily if variables that contain collections are pluralised (ie users = User.find :all rather than user = User.find( :all))

This shouldn't change the result of the code however. Seems to me that the data in your table might just be bad (or you're typing in the wrong password) - What is the value of User.encrypted\_password ( 'gica1', User.find(4).salt) ?

Having users with the same name is really rather weird - every website I can think of requires usernames to be unique

Fred

---

<div class="post-metadata">

**Author:** ![radu\_puspana](https://avatars.discourse-cdn.com/v4/letter/r/c2a13f/32.png) [@radu\_puspana](https://discuss.rubyonrails.org/u/radu_puspana)\
**Post date:** [January 4, 2010, 4:10pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/2 "2010-01-04T16:10:15Z")

</div>

> \> user.each do |correct\_user| \> expected\_password = User.encrypted\_password(password, correct\_user.salt) \> if correct\_user.hashed\_password == expected\_password \> idx = user.index(correct\_user) \> return user[idx] \> end \> end
> 
> This is somewhat unwieldy - why the busines with index when you could just return correct\_user ? Even better, use a method like detect - the code above is equivalent to user.detect {|current\_user| current\_user == User.encrypt(password, current\_user)}

the manbo jumbo with idx was that it was the only method which worked. as you suggested, i was putting in the wrong password, and the method did the correct this, it returned user=nil. The name problem, was another bad thing to do, I thought about it and it made no sense at all.Mistakenly i forgot that name was in fact the username, and i thought that two users can have the same name and surname, logically, but not the same username.I will create another column with this name,username, and leave the name column alone. Thx so much for the alternate version of my code, but i don't understand anything, as i said, i'm a noob, been working with rails about 3 months, and studied a nit of Ruby, about 3 chapters, about classes, objects and stuff.maybe you could translate it a bit for me, if you have the time, i will much appreciate it.

and this line : user.detect {|current\_user| current\_user == User.encrypt(password,current\_user)}, shouldn't be something like user.detect {|current\_user| current\_user == User.encrypt (password,current\_user.salt)}

> You'll also find your code reads more easily if variables that contain collections are pluralised (ie users = User.find :all rather than user = User.find( :all))

thx so much for this tip too, it doesn't have to do anything with the line user.detect {|current\_user| current\_user == User.encrypt (password, current\_user)} right?

> This shouldn't change the result of the code however. Seems to me that the data in your table might just be bad (or you're typing in the wrong password) - What is the value of User.encrypted\_password ( 'gica1', User.find(4).salt) ?
> 
> Having users with the same name is really rather weird - every website I can think of requires usernames to be unique
> 
> Fred

thx so much for all your help, have a Happy New Year ok? , sincerely, radu

---

<div class="post-metadata">

**Author:** ![Frederick\_Cheung](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/frederick_cheung/32/3901_2.png) [@Frederick\_Cheung](https://discuss.rubyonrails.org/u/Frederick_Cheung)\
**Post date:** [January 4, 2010, 4:22pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/3 "2010-01-04T16:22:42Z")

</div>

> and this line : user.detect {|current\_user| current\_user == User.encrypt(password,current\_user)}, shouldn't be something like user.detect {|current\_user| current\_user == User.encrypt (password,current\_user.salt)}

that's right. This means: iterate over the user collection, passing each element into the block as current\_user. return the first element for which the condition in the block returns true.

> \> You'll also find your code reads more easily if variables that contain \> collections are pluralised (ie users = User.find :all rather than user \> = User.find( :all))
> 
> thx so much for this tip too, it doesn't have to do anything with the line user.detect {|current\_user| current\_user == User.encrypt (password, current\_user)} right?

no. just a stylistic thing

Fred

---

<div class="post-metadata">

**Author:** ![radu\_puspana](https://avatars.discourse-cdn.com/v4/letter/r/c2a13f/32.png) [@radu\_puspana](https://discuss.rubyonrails.org/u/radu_puspana)\
**Post date:** [January 4, 2010, 4:53pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/4 "2010-01-04T16:53:36Z")

</div>

> \> and this line : user.detect {|current\_user| current\_user == \> User.encrypt(password,current\_user)}, shouldn't be something like \> user.detect {|current\_user| current\_user == User.encrypt \> (password,current\_user.salt)}
> 
> that's right. This means: iterate over the user collection, passing each element into the block as current\_user. return the first element for which the condition in the block returns true.

Sry for bothering you agan but shouldn't it be : user.detect {|current\_user| current\_user.hashed\_password == User.encrypt(password,current\_user.salt)} reather than user.detect {| current\_user| current\_user== User.encrypt (password,current\_user.salt)} ??. == means a condition if i recall correctly. because the string that comes out of User.encrypt (password,current\_user.salt)} should be compared with something in the current\_user, namely hashed\_password, not the object refered by the variable current\_user, right?

> \> \> You'll also find your code reads more easily if variables that contain \> \> collections are pluralised (ie users = User.find :all rather than user \> \> = User.find( :all))
> 
> \> thx so much for this tip too, it doesn't have to do anything with the \> line user.detect {|current\_user| current\_user == User.encrypt \> (password, current\_user)} right?
> 
> no. just a stylistic thing

thx again for the trick:)

> Fred

much much appreciate it Fred, regards, radu

---

<div class="post-metadata">

**Author:** ![Frederick\_Cheung](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/frederick_cheung/32/3901_2.png) [@Frederick\_Cheung](https://discuss.rubyonrails.org/u/Frederick_Cheung)\
**Post date:** [January 4, 2010, 5:34pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/5 "2010-01-04T17:34:57Z")

</div>

correct.

Fred

---

<div class="post-metadata">

**Author:** ![radu\_puspana](https://avatars.discourse-cdn.com/v4/letter/r/c2a13f/32.png) [@radu\_puspana](https://discuss.rubyonrails.org/u/radu_puspana)\
**Post date:** [January 4, 2010, 5:54pm UTC](https://discuss.rubyonrails.org/t/noob-question-each-problem/48321/6 "2010-01-04T17:54:44Z")

</div>

Problem solved!

Hi again Fred,

I tried user.detect {|current\_user| current\_user.hashed\_password ==User.encrypt(password,current\_user.salt)} and it worked like a charm.

thx a million yet again for ALL your help, radu
