Question

I'm following the rails-tutorials from Michael Hartl, it's really fun ! but i'm having troubles from upon listing 8.20 and so on. Cause i guessed i had made a type-o i erased the app and started from scratch again.. The best way to learn is repeat right ?

Well.. also on the second build i got the same error.

>    NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass

Extracted source (around line #7):


6  def create
7    user = User.find_by(email: params[:session][:email].downcase)
8    if user && user.authenticate(params[:session][:password])
9      sign_in user
10    else

after googling for a few hours i tried resetting the db ( drop / create / migrate test:prepare)

i have tried copying pieces of code out of the example (e.g. controllers/helpers/views) but I cant seem to find the solution.

Here is the code for

session_controller:

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
  end
end

session helper:

module SessionsHelper


 def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token  = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

    def sign_out
    current_user.update_attribute(:remember_token,
                                  User.encrypt(User.new_remember_token))
    cookies.delete(:remember_token)
    self.current_user = nil
  end



end

User model

class User < ActiveRecord::Base
    before_save {self.email = email.downcase }
    before_create :create_remember_token

    validates :name, presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX}, 
            uniqueness: {case_sensetive: false}
    has_secure_password
    validates :password, length: { minimum: 3 }

    def User.new_remember_token
        SecureRandom.urlsafe_base64
           # SecureRandom.urlsafe_base64

    end

    def User.encrypt(token)
        Digest::SHA1.hexdigest(token.to_s)
    end


        private
        def create_remember_token
            self.remember_token = User.encrypt(User.new_remember_token)
        end
end

user controller

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(user_params)
    if @user.save
        flash.now[:succes] = "Welcome to the sample app"
      redirect_to @user
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

and the user helper

module UsersHelper

  # Returns the Gravatar (http://gravatar.com/) for the given user.
  def gravatar_for(user, options = { size: 50 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

how can i properly copy-paste the error log ?

Was it helpful?

Solution

Based on the error you're getting, the problem is clearly somewhere in your Users controller:

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    sign_in user
  else
    flash.now[:error] = 'Invalid email/password combination'
    render 'new'
  end
end

The error is being generated because params[:session] is, in fact, nil. Now the question is, why?

My guess is that you have a typo in your sign_in form, it should be:

<%= form_for(:session, url: sessions_path) do |f| %>

  <%= f.label :email %>
  <%= f.text_field :email %>

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

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

Please make sure :session is typed correctly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top