我有一个Rails应用程序,其中用户长时间进入,并且我在会话中拥有user_id。下一步是为显示给data.user_id = session[:user_id]
的用户的所有模型数据创建范围。
我知道我可以在每个控制器中执行以下操作
Controller.find_all_by_user_id(session[:user_id])
但对我而言,似乎可能有更好的解决方案。我发现有可能在模型中添加一个范围,但是这里的会话并不知道,并且MVC模式明智地将它放在那里可能不是一个好主意。是否有解决方案将这样的user_id限制应用于来自模型的所有数据,或者我是否只对每个具有userdata的控制器函数使用find_all_by_user_id
?
答案 0 :(得分: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
答案 1 :(得分: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
并不是那么糟糕。