0

在我的應用程序中,我將用戶的ID存儲在會話[]中。在每個控制器動作的開始,我打電話到ApplicationController中稱爲CURRENT_USER定義的方法:如何在Rails中顯示頁面之前正確驗證用戶

def current_user 
    @current_user ||= session[:current_user_id] && 
    User.find_by_id(session[:current_user_id]) 
    end 

在我的控制器的方法的開始,我有以下幾點:

@current_user = current_user 
    if @current_user == nil  
    redirect_to :home   
    return      
    end       

這顯然是重複的代碼,應該是某處的方法。我讀了for this question的答案,並嘗試將我的方法放入父類,該類的控制器類現在下降了,但看起來我現在無法從該方法重定向。

在我父類的,我有:

def verify_user 
    user = current_user 
    if user == nil 
     redirect_to "/" 
     return 
    end 
    return user 
    end 

現在我已經改變了我的控制器方法如下:

@current_user = verify_user 

這不工作,我想我知道爲什麼。首先,我不能簡單地在我的verify_user方法中調用return,因爲這顯然只會返回到控制器。重定向似乎沒有任何影響,可能是因爲format.html在重定向調用後被調用,這是原始代碼返回的原因。

那麼,我在這裏做錯了什麼,你有什麼建議要解決它?這是錯誤的方法?我的主要目標是保持整個「檢查用戶是否登錄,否則重定向」每個控制器方法的一行代碼。

回答

1

添加下面的邏輯來ApplicationController類:

class ApplicationController < ActionController::Base 

    def current_user 
    ... 
    end 

    def logged_in? 
    current_user.present? 
    end 

    def require_user 
    return true if logged_in? 
    render_error_message("You must be logged in to access this page", 
     new_user_session_url) 
    return false 
    end 

    def render_message message 
    respond_to do |format| 
     format.html { 
     if request.xhr? 
      render(:text => message, :status => :unprocessable_entity) 
     else 
      redirect_to(root_url, :notice => message)   
     end 
     } 
     format.json { render :json => message, :status => :unprocessable_entity } 
     format.xml { render :xml => message, :status => :unprocessable_entity } 
    end 
    end 

end 

現在添加一個before_filter到控制器:

class OrdersController < ApplicationController 

    before_filter :require_user 

end 
+0

這確實是工作,但我還需要檢查設備或其他類似在sguha的帖子裏。 – Steve 2012-03-22 00:18:32

2

看看設計寶石https://github.com/plataformatec/devise。它爲您處理了很多這種基本的用戶身份驗證邏輯。我們可以通過將before_filter :authenticate_user!添加到控制器或需要保護的操作來解決這個特定問題。

相關問題