Search code examples
railstutorial.orgnomethoderror

Rails Tutorial 3.2 Chapter 8 error: NoMethodError in SessionsController#create


I'm going through the rails tutorial and my login page is throwing an exception after exercise 8.1.5 when I click the login button with no email or pw entered: http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec-rendering_with_a_flash_message

Error:

NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass
app/controllers/sessions_controller.rb:7:in `create'

SessionsController matches the final code exactly for the Create method

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by_email(params[:session][:email].downcase) #line 7
    if user && User.authenticate(params[:session][:password])
      #will fill this in later
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
  end
end

I did change the button label to Log in instead of "Sign in" as that is too confusing with "Sign up", but I didn't think that would create the problem. sessions\new.html.erb

<% provide(:title, "Log in") %>
<h1>Log in</h1>
<div class="row">
  <div class="span6 offset3">
    <%= form_for(:sesssion, url: sessions_path) do |f| %>
        <%= f.label :email %>
        <%= f.text_field :email %>

        <%= f.label :password %>
        <%= f.password_field :password %>

        <%= f.submit "Log in", class: "btn btn-large btn-primary" %>

    <% end %>
    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>

This post hints that I need a method in my user model, but adding that didn't help: NoMethodError in SessionsController#create

I tried adding this to user.rb, but it didn't help results from find_by_email executed in function differs from console:

def self.authenticate(email, submitted_password) 
    user = find_by_email(email)
    return user.nil? ? nil : user
end

Any ideas would be greatly appreciated!


Solution

  • I've looked at the example from the book and your code and I noticed this line

    if user && User.authenticate(params[:session][:password])
    

    your User.authenticate should be lowercased to user.authenticate. Revert back to your original code.