2
votes

I'm just learning RoR and have run into my first real bug. Would really appreciate some guidance with it. I am up to the point of creating a user sign in/out feature for a site I am building which will be maintained through sessions. When the sign in form submits it goes to a sessions controller which calls the 'create' method. When it does this it displays this error:

NoMethodError in SessionsController#create

You have a nil object when you didn't expect it! You might have expected an instance of ActiveRecord::Base. The error occurred while evaluating nil.[]

Here's the code for the create method:

  33 def create
  34   user = User.authenticate(params[:session][:email],
  35                           params[:session][:password])
  36   if user.nil?
  37     flash.now[:error] = "Invalid email/password combination."
  38     @title = "Sign in"
  39     render 'new'
  40   else
  41     sign_in user
  42     redirect_back_or user
  43   end
  44 end

The application trace says the error is at

app/controllers/sessions_controller.rb:34:in `create'

So the issue seems to be with the authenticate method. This is a class method defined for my user object. What's weird is that I tested the method in rails console and it works fine. Below is the full trace. Again would be very grateful for some help with this. Thanks you.

Trace:

app/controllers/sessions_controller.rb:34:in create' actionpack (3.0.4) lib/action_controller/metal/implicit_render.rb:4:in send_action' actionpack (3.0.4) lib/abstract_controller/base.rb:150:in process_action' actionpack (3.0.4) lib/action_controller/metal/rendering.rb:11:in process_action' actionpack (3.0.4) lib/abstract_controller/callbacks.rb:18:in block in process_action' activesupport (3.0.4) lib/active_support/callbacks.rb:435:in run_4224187041876590211__process_action_3718750575726612430_callbacks' activesupport (3.0.4) lib/active_support/callbacks.rb:409:in _run_process_action_callbacks' activesupport (3.0.4) lib/active_support/callbacks.rb:93:in run_callbacks' actionpack (3.0.4) lib/abstract_controller/callbacks.rb:17:in process_action' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:30:in block in process_action' activesupport (3.0.4) lib/active_support/notifications.rb:52:in block in instrument' activesupport (3.0.4) lib/active_support/notifications/instrumenter.rb:21:in instrument' activesupport (3.0.4) lib/active_support/notifications.rb:52:in instrument' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:29:in process_action' actionpack (3.0.4) lib/action_controller/metal/rescue.rb:17:in process_action' actionpack (3.0.4) lib/abstract_controller/base.rb:119:in process' actionpack (3.0.4) lib/abstract_controller/rendering.rb:41:in process' actionpack (3.0.4) lib/action_controller/metal.rb:138:in dispatch' actionpack (3.0.4) lib/action_controller/metal/rack_delegation.rb:14:in dispatch' actionpack (3.0.4) lib/action_controller/metal.rb:178:in block in action' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:62:in call' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:62:in dispatch' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:27:in call' rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in block in call' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in block in recognize' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:68:in optimized_each' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in recognize' rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in call' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:492:in call' actionpack (3.0.4) lib/action_dispatch/middleware/best_standards_support.rb:17:in call' actionpack (3.0.4) lib/action_dispatch/middleware/head.rb:14:in call' rack (1.2.2) lib/rack/methodoverride.rb:24:in call' actionpack (3.0.4) lib/action_dispatch/middleware/params_parser.rb:21:in call' actionpack (3.0.4) lib/action_dispatch/middleware/flash.rb:182:in call' actionpack (3.0.4) lib/action_dispatch/middleware/session/abstract_store.rb:149:in call' actionpack (3.0.4) lib/action_dispatch/middleware/cookies.rb:302:incall' activerecord (3.0.4) lib/active_record/query_cache.rb:32:in block in call' activerecord (3.0.4) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in cache' activerecord (3.0.4) lib/active_record/query_cache.rb:12:in cache' activerecord (3.0.4) lib/active_record/query_cache.rb:31:in call' activerecord (3.0.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in call' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:46:in block in call' activesupport (3.0.4) lib/active_support/callbacks.rb:415:in _run_call_callbacks' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:44:in call' rack (1.2.2) lib/rack/sendfile.rb:107:in call' actionpack (3.0.4) lib/action_dispatch/middleware/remote_ip.rb:48:in call' actionpack (3.0.4) lib/action_dispatch/middleware/show_exceptions.rb:47:in call' railties (3.0.4) lib/rails/rack/logger.rb:13:incall' rack (1.2.2) lib/rack/runtime.rb:17:in call' activesupport (3.0.4) lib/active_support/cache/strategy/local_cache.rb:72:in call' rack (1.2.2) lib/rack/lock.rb:11:in block in call' <internal:prelude>:10:insynchronize' rack (1.2.2) lib/rack/lock.rb:11:in call' actionpack (3.0.4) lib/action_dispatch/middleware/static.rb:30:in call' railties (3.0.4) lib/rails/application.rb:168:in call' railties (3.0.4) lib/rails/application.rb:77:in method_missing' railties (3.0.4) lib/rails/rack/log_tailer.rb:14:in call' rack (1.2.2) lib/rack/content_length.rb:13:in call' rack (1.2.2) lib/rack/handler/webrick.rb:52:in service' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:111:in service' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:70:in run' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/server.rb:183:in block in start_thread'

2
Ah didn't realize you were supposed to do this. Went through my answers and fixed this. - tks
Check the value of params[:session]. is it actually an array? I suspect it's nil. And post the form that posts to this action. - Thilo
Hi Thilo, I checked the form and I see I had the :session variable as ":sessions" which was causing the problem. It's fixed now. Thank you for your reply. If you'd like to submit it as an answer I will accept it. - tks

2 Answers

2
votes

params[:session] doesn't exist

def create
  user = User.authenticate(params[:session][:email],
                        params[:session][:password]) if params[:session]
   ...
0
votes

Instead of declaring method authenticate in class << self : class << self def authenticate(email, submitted_password) user = find_by_email(email) (user && user.has_password?(submitted_password)) ? user : nil end end

Try this: def self.authenticate(email, submitted_password). Be careful, you have to declare it out of class << self

In this case you are declaring a class method authenticate and you should able to call it in your controller, in the create method.