我有这个方法:
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
if params[:mypmnode]
session[:return_to] = projects_pmnode_path(params[:mypmnode])
sign_in(@user)
end
format.html { redirect_to(session[:return_to], :notice => 'User was successfully updated.') }
format.xml { head :ok }
else
@create_company = true if params[:user][:company_id].blank? and params[:user][:company_attributes].length > 0
@create_department = true if params[:user][:department_id].blank? and params[:user][:department_attributes].length > 0
format.html { render :action => "edit" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
这个想法是,如果用户被更新,他将自动登录并重定向到需要身份验证的页面。
在这个页面中,我有:before_filter:authenticate_user!
这不适用于重定向。
如果我转到另一个使用此sign_in函数的页面,则用户正确登录。
任何想法为什么重定向不起作用?谢谢!
更新:
为了更清楚,我插入第二页代码(控制器):
class PmnodesController < Projects::BaseController
before_filter authenticate_user!
def index
@pmnodes = Pmnode.all
respond_to do |format|
format.html
end
end
答案 0 :(得分:3)
如果在@user上更新密码,则设计将使会话无效。在update_attributes之后,您可以先尝试调用sign_out
。
sign_out(@user)
sign_in(@user)
答案 1 :(得分:0)
你确定你的程序进入了这个博客
if params[:mypmnode]
session[:return_to] = projects_pmnode_path(params[:mypmnode])
sign_in(@user)
end
如果不是,则应自动签署使用。
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
if params[:mypmnode]
session[:return_to] = projects_pmnode_path(params[:mypmnode])
end
sign_in(@user)
format.html { redirect_to(session[:return_to], :notice => 'User was successfully updated.') }
format.xml { head :ok }
else
@create_company = true if params[:user][:company_id].blank? and params[:user][:company_attributes].length > 0
@create_department = true if params[:user][:department_id].blank? and params[:user][:department_attributes].length > 0
format.html { render :action => "edit" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
答案 2 :(得分:0)
我遇到了类似的问题:
我有一个在用户中创建和签名的控制器方法
def new
@user = User.create!
sign_in @user
redirect_to some_nondefault_path
end
其中some_nondefault_path需要身份验证。 new
操作不需要身份验证。用户已创建并登录,但用户会话未持续存在且用户未获得401未授权并重定向到登录页面而不是some_nondefault_path。
我最后通过添加
解决了这个问题skip_before_filter :verify_authenticity_token, :only => :new
到第一个控制器。它似乎试图在创建用户会话之前验证CSRF令牌,这会失败并阻止创建正常的用户会话(即使它没有尝试authenticate_user!
)。
希望这有帮助!