将 friendly_id 添加到用户模型后登录后友好转发不起作用
Friendly forwarding after login doesn't work after adding friendly_id to the user model
我的应用程序的核心是从 Michael Hartl's rails tutorial 构建的。最近我更改了用户数据库,因此 name
列被命名为 username
并且我还添加了 friendly_id 以获得更漂亮的 URL。我根据这些更改更新了我能找到的所有地方,除了用户登录后的友好转发外,一切都运行顺利。例如如果未登录的用户访问用户编辑页面,他们将被带到登录页面,在他们登录后,他们应该被带到他们的编辑页面。但它只是让他们登录并停留在登录页面上。
我看不到任何需要更改的地方,所以它又可以工作了,据我所知它应该可以工作
会话控制器
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
用户控制器
before_action :correct_user, only: [:edit, :update]
before_action :logged_in_user, only: [:edit, :update]
def edit
end
private
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
def correct_user
@user = User.friendly.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
应用程序控制器
def redirect_back_or(path)
redirect_to request.referer || path
end
private
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "You gotta login first!"
redirect_to login_url
end
end
会话助手
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
有人知道问题出在哪里吗?
更新
在与@vishal 聊天后,重定向是从应用程序控制器redirect_back_or
方法
完成的
def redirect_back_or(path)
redirect_to request.referer || path
end
如果我把它改成
def redirect_back_or(path)
redirect_to root_path || path
end
我被带到了根路径,所以我知道这行 os most 可能是罪魁祸首。
在工作和不工作之间,我为私人消息添加了邮箱 gem,将用户数据库 name
更改为 username
,并将 friendly_id 添加到username
列。也许其中的某些事情可能会引起您的注意,因为它会停止工作。
在您的应用程序控制器中,将 redirect_back_or(path) 方法更改为此。
def redirect_back_or(path)
redirect_to session[:forwarding_url] || path
session.delete(:forwarding_url)
end
您之前有 redirect_to request.referer
,它负责将您重定向到最后一个 url,即 login_url。
我不知道您为什么要定义两种不同的方法 - 1 个在 ApplicationController 中,1 个在 SessionsHelper 中 - 虽然名称相同但预期行为不同。
我的应用程序的核心是从 Michael Hartl's rails tutorial 构建的。最近我更改了用户数据库,因此 name
列被命名为 username
并且我还添加了 friendly_id 以获得更漂亮的 URL。我根据这些更改更新了我能找到的所有地方,除了用户登录后的友好转发外,一切都运行顺利。例如如果未登录的用户访问用户编辑页面,他们将被带到登录页面,在他们登录后,他们应该被带到他们的编辑页面。但它只是让他们登录并停留在登录页面上。
我看不到任何需要更改的地方,所以它又可以工作了,据我所知它应该可以工作
会话控制器
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
用户控制器
before_action :correct_user, only: [:edit, :update]
before_action :logged_in_user, only: [:edit, :update]
def edit
end
private
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
def correct_user
@user = User.friendly.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
应用程序控制器
def redirect_back_or(path)
redirect_to request.referer || path
end
private
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "You gotta login first!"
redirect_to login_url
end
end
会话助手
# Redirects to stored location (or to the default).
def redirect_back_or(default)
redirect_to(session[:forwarding_url] || default)
session.delete(:forwarding_url)
end
# Stores the URL trying to be accessed.
def store_location
session[:forwarding_url] = request.url if request.get?
end
有人知道问题出在哪里吗?
更新
在与@vishal 聊天后,重定向是从应用程序控制器redirect_back_or
方法
def redirect_back_or(path)
redirect_to request.referer || path
end
如果我把它改成
def redirect_back_or(path)
redirect_to root_path || path
end
我被带到了根路径,所以我知道这行 os most 可能是罪魁祸首。
在工作和不工作之间,我为私人消息添加了邮箱 gem,将用户数据库 name
更改为 username
,并将 friendly_id 添加到username
列。也许其中的某些事情可能会引起您的注意,因为它会停止工作。
在您的应用程序控制器中,将 redirect_back_or(path) 方法更改为此。
def redirect_back_or(path)
redirect_to session[:forwarding_url] || path
session.delete(:forwarding_url)
end
您之前有 redirect_to request.referer
,它负责将您重定向到最后一个 url,即 login_url。
我不知道您为什么要定义两种不同的方法 - 1 个在 ApplicationController 中,1 个在 SessionsHelper 中 - 虽然名称相同但预期行为不同。