我正在关注http://ruby.railstutorial.org
上的教程具体而言,第9章(9.2.3) http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#top
当访问受限制的页面时会提示用户登录,然后在成功登录后重定向回受限制的页面,我成功获得了该部分。
我正在努力获取它,以便在重定向到受保护的页面后,下次登录尝试将直接返回到主用户个人资料页面,但是,session.delete(:return_to)
似乎无法正常工作用户被反复定向回最初保存的受保护页面。这是我的代码:
我的会话控制器:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_back_or user
# Sign the user in and redirect to the user's show page.
else
# Create an error message and re-render the signin form.
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
...
end
我的会话助手:
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.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.find_by_remember_token(cookies[:remember_token])
end
def current_user?(user)
user == current_user
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.url
end
end
你能给予的任何帮助都会非常棒!似乎session.delete()
根本无效。
答案 0 :(得分:1)
当我完成本教程时,我的代码只有SessionsController#create
方法的第一行:
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
但是,我可以看到the corresponding code in the book已更改为:
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
我试图在我的sample_app
中使用这个新代码,但我的大部分测试都失败了。因此,对于您,我猜测试首先将downcase
方法添加到您的params[:session][:email]
调用中,如果这不起作用,请尝试将这些行替换为session
- 上面的代码更少并看看它是否有效。
在查看您的代码后,据我所知,这些是您的问题:
您出于某种原因在session.delete(:return_to)
中呼叫SessionsController#create
。此行可以删除:
应用/控制器/ sessions_controller.rb 强>
def create
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
# session.delete(:return_to)
sign_in user
# ...
#...
end
UsersController#signed_in_user
方法中的两行代码都需要放在unless
块中,而不只是调用redirect_to
:
应用/控制器/ users_controller.rb 强>
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in." #unless signed_in?
end
end
如果您进行了这些更改并运行测试,那么您的通话中仍会有Nokogiri::XML::XPath::SyntaxError:
<强>规格/请求/ authentication_pages_spec.rb 强>
it { should have_exact_title('title', text: full_title('')) }`
但我假设这是一个你计划进行的自定义匹配器。如果没有,这是一个错误,删除它,你的所有测试都将通过。
答案 1 :(得分:1)
以下街区解决了这个问题。没有什么需要改变。
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in." #unless signed_in?
end
end