1

我有这个方法:

  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
4

3 回答 3

3

如果在@user 上更新密码,设计将使会话无效。在 update_attributes 之后,您可以尝试sign_out先调用。

sign_out(@user)
sign_in(@user)
于 2012-06-06T00:44:28.890 回答
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
于 2012-06-04T15:29:37.467 回答
0

我有一个类似的问题:

我有一个创建并登录用户的控制器方法

def new
  @user = User.create!
  sign_in @user
  redirect_to some_nondefault_path
end

其中 some_nondefault_path 需要身份验证。该new操作不需要身份验证。用户被创建并登录,但用户会话没有持续,用户得到 401-unauthorized 并被重定向到登录页面而不是 some_nondefault_path。

我最终通过添加解决了它

skip_before_filter :verify_authenticity_token, :only => :new

到第一个控制器。它似乎试图在创建用户会话之前验证 CSRF 令牌,该会话失败并阻止了正常用户会话的创建(即使它没有尝试authenticate_user!)。

希望这可以帮助!

于 2015-01-28T17:36:43.680 回答