0

我有一个用户渴望的 Rails 应用程序,并且我在会话中有 user_id。下一步是为向用户显示的所有模型数据创建一个范围data.user_id = session[:user_id]

我知道我可以在每个控制器中执行以下操作

Controller.find_all_by_user_id(session[:user_id])

然而对我来说,似乎有更好的解决方案。我发现了向模型添加范围的可能性,但是这里不知道会话,并且从 MVC 模式的角度来看,将它放在那里可能不是一个好主意。有没有一种解决方案可以对来自模型的所有数据应用这样的 user_id 限制,或者我应该只find_all_by_user_id对每个包含 userdata 的控制器函数使用?

4

2 回答 2

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
于 2012-09-30T12:02:12.977 回答
1

你可以有before_filter :load_user_data, :if => current_user或类似的东西。方法将如下所示:

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

@data将是ActiveRecord::Relation并且将是可链接的。find_all_by_user_id如果您真的需要它,也可以在每个控制器中使用它。

于 2012-09-30T12:08:00.357 回答