1

Following Hartl's RailTutorial for Rails(3.2). I keep getting this error message or oddly a "The connection was reset" message:

ActiveRecord::RecordNotFound in UsersController#show 
Couldn't find User without an ID

I'm trying to log in and after successfully logging in, I want the application to redirect the user to user/show.html.erb. I believe that I'm passing the :id parameter in the show method in the users controller. Any tip/help would be appreciated!

I've pasted some relevant files below. Let me know if you guys need anything else.

sessions_controller.rb

class SessionsController < ApplicationController

def new
  @title = "Log in"
end

def create
  user = User.find_by_email(params[:session][:email])               
  if user.nil?
     flash.now[:error] = "Invalid email/password combination."
      @title = "Sign in"
      render 'new'
   else
     flash.now[:success] = "Successful login!"
     sign_in user
      redirect_to 'users/show'
    end
 end

def destroy
    sign_out
    redirect_to root_path[:name]
end
end

users_controller.rb

class UsersController < ApplicationController


def new
  @user = User.new
  @title = "Sign up"
end

def show
  if params[:id].nil? && current_user
    @user = current_user
  else
    @user = User.find(params[:id])
  end
  @title = @user.name
  end


def create
  @user = User.new(params[:user])
  if @user.save
    sign_in @user
    flash[:success] = "Account created!"
    redirect_to @user
   else
     @title = "Sign up"
     render 'new'
   end
  end

def destroy
  @user.destroy
  redirect_to users_path, :flash => { :success => "User destroyed." }
 end

end

routes.rb

SampleApp::Application.routes.draw do

  resources :users
  resources :sessions, :only => [:new, :create, :destroy]   


  match '/sessions', :to => 'users#show'
  match '/signup', :to => 'users#new'
  match '/login', :to => 'sessions#new'
  match '/logout', :to => 'sessions#destroy'

  root :to => 'pages#home'

Edit: Added sessions_helper.rb

module SessionsHelper

def sign_in(user)
    cookies.permanent.signed[:remember_token] = user.remember_token
    current_user = user
end


def signed_in?
  !current_user.nil?
end

def current_user=(user)
    @current_user = user
end

def current_user
  @current_user ||= user_from_remember_token
end


def sign_out
  cookies.delete(:remember_token)
  current_user = nil
end

private

def user_from_remember_token
  remember_token = cookies[:remember_token]
  User.find_by_remember_token(remember_token) unless remember_token.nil?
end



end
Huy
  • 10,806
  • 13
  • 55
  • 99

2 Answers2

3

I think in the def create in session controller you have not passed any id . If you have session user id please pass with it

Code can be

redirect_to 'user/show' , :id => session[:user_id]
redirect_to user_url(:session[:user_id])

Can you please check current_user be. with rendering like

render :text => current_user.inspect and return false in session controller before

redirect_to user_url(:session[:user_id])

. If it does not come there is a problem in your authentication .

Arpit Vaishnav
  • 4,739
  • 6
  • 39
  • 57
  • I tried the above code, but still received the same error. Looks like there might be a trouble in my implementation as pointed out by iltempo. I added the sessions helper. – Huy Mar 07 '12 at 07:43
1

Seems like current_user is nil in your case. Let's have a look on your UsersControllers show action. It is trying to find a User record with id = params[:id] which is not set if your url is users/show. Find ActiveRecords find method expects to find a record and throws the error if not.

Try to find out why current_user is evaluating to nil. Could be that you are just not logged in or that there is bug in your implementation.

iltempo
  • 15,718
  • 8
  • 61
  • 72
  • Also, do you mind elaborating more on why id = params[:id] would not be set if my url is users/show? I've tried adding redirecting and passing id `:id=>session[:user_id]` but still have the same error. – Huy Mar 07 '12 at 07:57