我有一个 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
?
理解正确,您希望通过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
你可以有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
也不错。