Login/signup function not working, @current_user not working, sessions not working

随声附和 提交于 2019-12-14 03:30:11

问题


I'm new to Rails, and am working on a practice app that involves a simple login function. I've been following a tutorial from CodeAcademy by the books, however the code is not working in quite a few ways. First of all, the sessions do not set, even though Rails is executing the rest of the code inside the "if" block shared with the session declaration (btw, no errors are returned).

The session controller:

class SessionsController < ApplicationController
  def new

  end

 def create
  @user = User.find_by_username(params[:session][:name])
  if @user && @user.authenticate(params[:session][:password])
    session[:user_id] = @user.id
    redirect_to '/posts'
  else
    session[:user_id] = nil
    flash[:warning] = "Failed login- try again"
    redirect_to '/login'
  end 
end

  def destroy
session[:session_id] = nil 
redirect_to login_path 
  end
end 

Extrapolating from that issue, my "current_user" function is not working, which is most likely because the session is not being set.

The application controller:

class ApplicationController < ActionController::Base
def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end

Any help is much appreciated. Let me know if you need to see anything else.

NOTE: I know I should use Devise, and I am planning to in my future, more serious projects. However, like I said, this is a practice/test app to help develop my coding skills, and before using a "magical" gem like Devise I want to get hands-on experience with making a login system myself.


回答1:


I think the error is that session_controller is not able to find the current_user.

Write the following code in application_controller:

class ApplicationController < ActionController::Base

   helper_method :current_user

   def current_user
     return unless session[:user_id]
     @current_user ||= User.find(session[:user_id])
   end

   def require_user 
    redirect_to '/login' unless current_user 
   end

end

Letme know if it works




回答2:


There are a few possible problems.

First, @current_user is not set until the current_user method is called. And as @Neha pointed out, you'll need to add a helper method to your ApplicationController so that all your views will have access to the current_user method. Add this line to your ApplicationController:

helper_method :current_user

Now, to diagnose the problem, let's set something up that lets you get some visibility into your session and current_user.

First, in views/layouts/application.html.erb, just after the line that says <= yield %>, add this:

<%= render 'layouts/footer' %>

Then add a new file views/layouts/_footer.html.erb:

<hr/>
Session:<br/>
<% session.keys.each do |key| %>
  <%= "#{key}: #{session[key]}" %><br/>
<% end %>
<br/>
User:<br/>
<%= current_user&.username || '[None]' %>

Now at the bottom of every view you can see the details of your session.

In your sessions#create action, you have a potential problem with finding your User. You are using params[:session][:name] where you probably should be using params[:session][:username].

Also, tangentially, the proper way to destroy a session is not by setting session[:id] to nil, but instead to use reset_session. So your SessionsController should look like this:

class SessionsController < ApplicationController
  def new
  end

  def create
    @user = User.find_by_username(params[:session][:username])
    if @user && @user.authenticate(params[:session][:password])
      session[:user_id] = @user.id
      redirect_to '/posts'
    else
      session[:user_id] = nil
      flash[:warning] = "Failed login- try again"
      redirect_to '/login'
    end
  end

  def destroy
    reset_session
    redirect_to login_path
  end
end


来源:https://stackoverflow.com/questions/54032439/login-signup-function-not-working-current-user-not-working-sessions-not-worki

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!