ActiveRecord :: RecordNotFound - Could not find user without ID

Following the Hartl RailTutorial for Rails (3.2). I keep getting this error message or, strangely enough, the message "Connection was reset":

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

I try to log in and after a successful log in, I want the application to redirect the user to /show.html.erb. I believe that I pass the: id parameter in the show method in the user controller. Any advice / help would be appreciated!

I have added some relevant files below. Let me know if you need most.

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 session_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 
+1
source share
2 answers

I think in def def in the session controller you did not pass any identifier. If you have a session user ID, go with it

Code may be

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

Can you check current_user. with rendering like

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

 redirect_to user_url(:session[:user_id]) 

. If this does not happen, a problem will arise in your authentication.

+3
source

It seems that current_user nil in your case. Let’s take a look at your Users Controllers action. It tries to find a user record with id = params[:id] which is not set if your url is user / show. Find method ActiveRecords find expects to find a record and throws an error if not.

Try to find out why current_user evaluates to nil. Maybe you just haven't logged in, or that there is an error in your implementation.

+1
source

Source: https://habr.com/ru/post/950478/


All Articles