2009-08-19 73 views
1
  • 警告:完整的新手RoR和Ruby警報! *

我有一個看起來像這樣的登錄方法:Ruby on Rails會話存儲 - 如何*不*在會話存儲中存儲某些字段?

@user = Person.find(:first, :conditions => ["email=?", params[:email]]) 
if @user and @user.password==params[:user_password] 
    session[:user] = @user 
else 
    flash[:warn] = 'Invalid password!' 

然而,用戶記錄可以得到非常大,所以我不想整個用戶記錄存儲在我的cookie會話。

我該如何修改這段代碼,使特定字段不會得到存儲在會話中?有兩個字段可以獲得非常大的大(非常大的用戶配置文件數據),並且不符合cookie會話4千字節限制,所以我想排除那些存儲在會話中。

回答

2

我會做:

session[:user] = @user.id 

,然後創建的before_filter會是這樣的:

before_filter :get_user 

def get_user 
    @user = User.find_by_id(session[:user]) 
end 

編輯:這不正是你要找的,但如果你不能將所有對象存儲在會話變量中,您可能需要考慮此選項。這只是一個請求,所以它不會太耗費資源。此外,您可以檢查用戶存在的每個頁面加載情況,這可能會有所幫助,安全明智。

+1

如果您更改模型並更新應用程序,將整個模型存儲在會話中也是一個壞主意。對於新模型類,較舊會話中的實例可能不適用。 – 2009-08-19 15:32:46

+0

對此+1,我同意這是爲了避免 – marcgg 2009-08-19 15:35:01

+0

謝謝,這工作。我從其他人那裏繼承了這個應用程序......直到大約30分鐘前,我才知道任何Ruby。 :-) – 2009-08-19 18:49:20

0

Rails的設計經常用來引導你在一個非常特定的方向。在這種情況下,默認情況下,Rails的會話存儲在cookie中,這是一個強烈的暗示,你不應該在會話中存儲大對象。通過一切手段存儲用戶ID,但不是User對象本身。

+0

不幸的是,我沒有構建應用程序,我只是想讓它工作。我沒有時間或資源來重建應用程序,因此它只存儲用戶ID。 – 2009-08-19 15:25:01