7stud -- wrote in post #1013962:
> The part that really confused me on p. 345 is where the
> author says:
>
> ==
> self.current_user = user
>
> The purpose of this line is to create current_user, accessible in both
> controllers and views which will allow constructions such as:
>
> <%= current_user.name %>
>
> and
>
> redirect_to   current_user
> ==
>
> The author says "current_user" not 'the current_user function".

Actually,  in the line:

self.current_user = user

the function being called is named 'current_user='.  ruby syntax just
permits you to write it with a space before the equals sign.

It's hard to tell if its just a typo when the author says
'current_user', and the author really means '@current_user'.  Then there
is this final statement on the page:

==
The principal goal of this section is to define current_user.
==

A current_user getter method??!  What's that got to with the line:

> self.current_user = user

I'm going to go with the following 'translations' (because it's the only
way things make sense to me):

On page 345, this part:

===
self.current_user = user

The purpose of this line is to create current_user.
===

should say:

==
The purpose of this line is to to create @current_user.
==

And this introduction:

==
The principal goal of this section is to define current_user.
==

Should be clarified by saying:

==
The principal goal of this section is to define the current_user getter
function.
==


Also I said this:

> Now the question is why use self in the sign_in method here:
>
> def sign_in
>   ...
>   self.current_user = user
> end
>
> when you can avoid all that confusing stuff and just write:
>
> def sign_in
>
>   @current_user = user
> end
>
>
> The answer is it's good practice to always use an accessor method to
> access an instance variable--rather than assign directly to an instance
> variable.
>

In that context, let's look at the current_user function that the
author came up with:

def current_user
  @current_user ||= user_from_remember_token
end

I see two problems with that function.  First off, that is a getter
function, yet it can set the @current_user variable.  Getter functions
should not set instance variables.  Secondly, the function directly sets
the @current_user variable instead of calling the current_user= setter 
function.

Looking at the application code, i.e. the create action, nothing even
calls the current_user getter method.  The create action calls the
sign_in helper method, but sign_in doesn't call current_user.  The only
thing that calls current_user is one of the tests.  So we're testing
something that the application code doesn't even use???

In my opinion, the current_user getter method as defined in the book is
a complete disaster: breaking it up into three methods is confusing, a
getter method shouldn't set an @ variable, and an @ variable should be
set indirectly by calling the @ variable's setter method.

-- 
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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to