2012-09-30 38 views
0

我有一個Rails應用程序,其中用戶長期在,我有會話中的user_id。下一步是爲用戶顯示的所有模型數據創建一個範圍,其中data.user_id = session[:user_id]Rails範圍模型數據由user_id

我知道我可以做我的每個控制器

Controller.find_all_by_user_id(session[:user_id]) 

以下但對我來說,似乎有可能是一個更好的解決方案。我發現可以向模型添加一個範圍,但會話在這裏是不知道的,而MVC模式明智的做法可能不是一個好主意。有沒有解決方案將這樣的user_id限制應用於來自模型的所有數據,還是我應該使用find_all_by_user_id來控制每個具有userdata的控制器功能?

回答

3

如果我的理解正確,您想訪問user_id的一些數據。這意味着你可以在用戶模型中定義關係爲has_many :this_and_that或類似的東西。它是正確的,那麼你可以創建一個before_filter甚至更​​好的函數在你的應用程序控制器中獲得當前用戶實例。通過這種情況,您可以訪問該用戶的所有可用數據。你甚至可以使該函數成爲輔助函數,並且你可以在視圖中使用它。

#User.erb 
has_many :other_data 

#ApplicationConroller.erb 
def current_user 
    @current_user ||= User.find_by_id(session[:user_id]) 
end 

#OtherControllers 
def index 
    @other_datas = current_user.other_datas 
end 
+0

這工作出色,看起來像一個非常整潔的解決方案。謝謝! –

+0

這是一個很好的答案,並且在Michael Hartl的「Ruby on Rails教程」中有很好的解釋 – Sardonic

1

你可以有before_filter :load_user_data, :if => current_user或類似的東西。 方法看起來就像是:

def load_user_data 
@data = ModelName.where(user_id: session[:user_id]) 
end 

@dataActiveRecord::Relation,將是可鏈接。如果你真的需要,也可以在每個控制器中使用find_all_by_user_id