2010-07-14 36 views
0

我在整個應用程序中都有語句,如@user = User.find(current_user.id)優雅地轉義錯誤

有時用戶可能會輸入一個零變量(例如current_user爲零的新用戶)。

我敢肯定,這樣做將是散射啞方式,如果喜歡到處發言...

if current_user.exists? 
    @user = User.find(current_user.id) 
else 
    redirect_to root_url 
    ---*or*--- 
    @user = "new" # for use with if/case statements later on 
end 

什麼是優雅的方式來應對這種混亂呢?

回答

0

@user = User.find(current_user.id)有點不必要。這主要是因爲CURRENT_USER是一個User對象了,所以至少是你應該做的@user = current_user,但我會建議,如果尚未通過認證框架完成後,我將它添加到你的應用程序控制器:

helper_method :current_user 

這將使current_user對象可用於您的視圖,並呈現@user對象不必要的。

對於處理重定向,我通常有這在我的應用控制器:

before_filter :require_login 

def require_login 
    current_user || redirect_to(root_url) 
end 

然後在我的控制器不希望重定向:

skip_before_filter :require_login 

關於用戶設置新,我不會這樣做。我通常喜歡我的User對象作爲用戶對象。我只想通過if current_user來測試新用戶,其中無current_user與將其設置爲'new'相同。

我希望這有助於

+0

太棒了!謝謝Geoff。 – sscirrus 2010-07-15 18:49:15

0

假設您使用的語言是面向對象的,我會創建一個保存當前用戶上下文的對象。默認情況下,您可以爲訪問非常有限的未知用戶使用CurrentUserContext實例。

當用戶登錄時,可以將所有用戶信息和安全信息加載到CurrentUserContext的新實例中。

這只是一個粗略的想法,但也許有幫助。

編輯:這種方式你不需要創建所有類型的安全異常規則......你只是假定當前上下文實例的安全設置和適當的應用程序行爲。

+0

您可以找到連接到問題的標記語言,在這種情況下,Ruby on Rails的。非常感謝您的回答。 – sscirrus 2010-07-15 18:47:56

0

要獲得尼爾斯在沒有當前用戶:

@user = current_user && User.find(current_user.id)

要獲得 「新」 在沒有當前用戶:

@user = current_user ? User.find(current_user.id) : 'new'

無論真正解決問題,但現在至少它在一條線上。對於更一般的解決方案,也許你應該取消current_user變量。