2015-04-21 31 views
1

好吧我創建了一個用戶和登錄表單並添加了會話支持。它正確顯示登錄表單。我登錄後會顯示消息「已登錄!」。在這裏正常工作。RoR - 會話無法正常工作(登錄/退出)

但它仍然顯示我的登錄字段。我也在那裏添加了一個「註銷」鏈接,如果用戶登錄,則顯示註銷。但它給了我登錄成功的消息和登錄表單。

這裏是application.html.erb文件

<header> 
    <div class="wrapper"> 
     <img src="/gfx/logo.png"> 
     <span>Welcome</span> 
     <% if current_user %> 
      <%= link_to "Log Out", logout_path %> 
     <% else %> 
      <%= form_tag sessions_path do %> 
       <%= text_field_tag :username, nil, placeholder: "username" %> 
       <%= password_field_tag :password, nil, placeholder: "password" %> 
       <%= submit_tag "Log In" %> 
      <% end %> 
     <% end %> 
    </div> 
</header> 

的會話控制器:

class SessionsController < ApplicationController 

    def create 
    user = User.find_by_username(params[:username]) 
    if user && user.authenticate(params[:password]) 
     session[:userid] = user.id 
     redirect_to root_url, notice: "Logged in!" 
    else 
     flash[:error] = "Wrong Username or Password." 
     redirect_to root_url 
    end 
    end 

    def destroy 
    session[:userid] = nil 
    redirect_to root_url, notice: "Logged out." 
    end 

end 

應用控制器:

private 

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

helper_method :current_user 

而且用戶控制器(創建)行動:

def create 
    @user = User.create(user_params) 

    if @user.save 
    session[:user_id] = @user.id 
    redirect_to @user, notice: "Thank you for signing up!" 
    else 
    render 'new' 
    end 
end 
+2

當您創建的會話使用了'會話[:用戶ID]'當你檢查用戶登錄後使用'session [:user_id]' – Mischa

回答

2

sessiondestroycreate方法看起來不對。從session[:userid]將其更改爲session[:user_id]

destroy

session[:user_id] = nil 

create

session[:user_id] = user.id 
+0

更好的方法是執行'session.delete(:user_id)',這會擦除'session'哈希的':user_id'鍵,而不僅僅是將其設置爲「nil」。 – MrYoshiji

+0

非常感謝!你是男人! – hassanyf