2012-06-04 19 views
1

工作,我有这样的方法:导轨设计sign_in不会对重定向

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函数的页面,则用户将正确登录。

任何想法为什么重定向不起作用?谢谢!

UPDATE:

,以使其更清晰,我插入第二个页面代码(控制器):

class PmnodesController < Projects::BaseController 

    before_filter authenticate_user! 

    def index 
    @pmnodes = Pmnode.all 
    respond_to do |format| 
     format.html 
    end 
    end 
+0

你的意思是用户在更新属性后应该重定向到login(sign_in)页面? –

+0

不,我试图让他自动登录,然后将他重定向到私人页面,而无需手动登录。 – ndemoreau

回答

3

如果在@user上更新密码,devise会使会话无效。在update_attributes之后,您可以先尝试拨打sign_out

sign_out(@user) 
sign_in(@user) 
+0

这也适用于我。作为管理员,我想以其他用户身份登录,但首先我必须sign_out。 – brendan

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 
+0

是的,我很积极!重定向转到右页。我认为current_user在更新记录后没有被正确地重新定义。我更新密码,所以如果authenticate_user!使用旧的密码值,这可能是问题的原因。但我不知道如何强制更新current_user – ndemoreau

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!)。

希望这会有所帮助!