Leonel, Sorry, I have been of the line for sometime. I haven't followed this mail thread, but I had already answered your problem last Friday, so I just send it through. I hope my contribution will still be of good help.
Le 14 octobre 2010 18:27:44 UTC+2, Leonel *.* <[email protected]> a écrit : > > For testing sake (or whether you call it bug hunt), > > I would find the user first and search for the user's account. In that > way > > I will be able to test for the avaliabilty of the user and the > > availability of the account separately. > > Thanks, ok, so I did this... > > APPLICATION CONTROLLER > class ApplicationController < ActionController::Base > before_filter :authorize > > protect_from_forgery > > @user_id = User.find_by_id(session[:user_id]) > @account_id = @user_id.account.id > > protected > > def authorize > unless User.find_by_id(session[:user_id]) > redirect_to login_url, :notice => "Please log in" > end > end > > end > > ERROR > Routing Error > undefined method `account' for nil:NilClass > > Like the error reads, I think I need to do something on the routes file. > I'm not sure what 'cause I'm a newbie but I'm searching for the answer. > The error means that you are accessing an "account" attribute of a nil user. Allow me to provide a little bit of a tutorial. ============================== Of course, I see "protect_from_forgery" method, but let me assume that I don't see it. In general, any code that is not in a method is generally executed as Ruby goes parses the script. As most languages do, Ruby too executes every script sequentially from top to bottom (unless there are conditions to change the order). Suppose we have the following: statement_1 def my_method some_code end statement_2 statement_3 my_method # call to my method Then Ruby will execute statement_1, statement_2, statement_3 and the calls the method my_method. It just "skips" the method declaration (if seasoned programmers allow me to say so). Now, in you code, I believe that at the point you are finding the User, session[:user_id] is still null. In order to prove it, try to raise the session variable before this @user_id = User.find_by_id(session[:user_id]). Thus try, this: raise "The id of the current user is #{session[:user_id]} . Hip-hop Hooray!!!" @user_id = User.find_by_id(session[:user_id]) If the user id exists in session[:user_id] it will be printed out. If it gets printed out, make sure that it matches the user_id you have put in session. I haven't tested you code for this, but I hypothesize that the session[:user_id] will not be printed out. Now, What do you need to get it right? ============================ I would suggest that the following possible idea. I notice you have before_filter: authorize. in your authorize method after authenticating the user, put the user id in session. Look out for consistency (session[:user_id] may not equal to session["user_id"])!!! Here is my sample code!!!!!!!! Notice where I am initiating session[:user_id]. def login session[:user_id] = nil if request.post? username = params[:user][:username] password = params[:user][:password] user = User.authenticate(username, password) if user session[:user_id] = user.id else flash[:notice] = "Invalid user/password combination" end end end Now you are safe to use session[:user_id] as follows (You may place this code in the index method of your ApplicationController): @company_name = User.find(session[:user_id]).account.name unless (session[:user_id].empty?) You can also take advantage of the "if user" block statement above (since it is execute if an only if the user is authenticated), find the user's account and just keep the account name in session (It might not be a good programming practice, but it can save a lot. This is just my recommendation!!). --- Edmond Software Developer | Baobab Health Trust (http://www.baobabhealth.org/) | Malawi Cell: +265 999 465 137 | +265 881 234 717 *"Leading the Improvement of Health through Information and Communication Technology in the Developing World" The **Creed* of *Baobab Health * -- 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.

