rails devise sign_in不能用于重定向

时间:2012-06-04 11:15:29

标签: ruby-on-rails devise signing

我有这个方法:

  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

3 个答案:

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

希望这有帮助!