【发布时间】:2016-08-25 16:33:43
【问题描述】:
遵循 ruby on rails 教程 (https://www.railstutorial.org/book/log_in_log_out)。注销功能不起作用。我生成了一个“会话”控制器,并定义了一个方法destroy to 'log_out' 'current_user' 这是一个实例变量,并在调用log_out 方法时更改为nil。 session_helper.rb 中的“log_out”方法。
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end
def logged_in?
!current_user.nil?
end
def log_out
debugger
session.delete(:user_id)
@current_user = nil
end
end
我使用删除请求来“/注销”。
delete 'logout' => 'sessions#destroy'
视图中布局的相关部分
<% if logged_in? %>
<ul class="text-center nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Account <span class="caret"></span></a>
<ul class="text-center dropdown-menu">
<li class="text-center"><%= link_to "Profile", current_user %></li>
<li class="text-center"><%= link_to "Settings", "#" %></li>
<li role="separator" class="divider"></li>
<li class="text-center"><%= link_to "Log Out", logout_path, :method => :delete %></li>
</ul>
</li>
</ul>
<% else %>
<li><a id="signin" href="/login">Sign In</a></li>
<% end %>
我相信 log_out 方法不起作用,因为视图没有改变,根据<% if logged_in? %> 行,logged_in 方法应该防止在删除会话时呈现视图的一部分。 'logged_in' 在哪里?方法在 session_helper.rb 中定义,如果用户已登录,则返回布尔值 true。
整个路线.rb
Rails.application.routes.draw do
root 'static_pages#home'
get 'about' => 'static_pages#about'
get 'help' => 'static_pages#help'
get 'signup' => 'users#new'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
resources :users
end
整个 session_controller.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
end
end
整个 session_helper.rb
module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end
def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end
def logged_in?
!current_user.nil?
end
def log_out
session.delete(:user_id)
@current_user = nil
end
end
【问题讨论】:
标签: ruby-on-rails ruby