2012-06-04 40 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!)。

希望這會有所幫助!