在我的应用程序中,我有一个包含许多规则的标题,因为我有很多类型的配置文件。
我想做一个一个查询(可能是两个)来获取用户并进行我需要的所有检查
在我的应用程序控制器中,我有这个方法:
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
要检查当前用户,但我一直在我的header.html.erb上调用它,如果我检查它,就像10次一样,我会做10次查询......
据我所知,当我第一次拨打current_user
时,我会得到一个变量@current_user
。但是当我有一个控制器时,这对我来说很明显。我致电current_user
,在我看来,我只需查看@current_user.something
。因为/layouts/_header.html.erb没有控制器,我怎么能这样做?
答案 0 :(得分:0)
如果查找成功,您所拥有的内容不应执行多个查询 - 它会将@current_user
设置为查询的返回值,然后在将来返回该值。但是,如果找不到用户,则@current_user
将初始化为nil
,因此对current_user
的其他调用将再次执行查询。
一种可能的解决方法是使用defined?
运算符,如下所示:
def current_user
return @current_user if defined?(@current_user)
@current_user = User.find_by_remember_token(cookies[:remember_token])
end
但是我不喜欢这个实现,因为如果任何在当前闭包中定义@current_user
,那么这将返回值,无论查找是否已完成。您还可以设置另一个变量,该变量跟踪当前用户是否已被查找,如果有,则仅执行查询,但这对我来说似乎也很难看。
有关此常规问题的更强大的解决方案,请参阅memoist gem。或者更好的是,您是否考虑过devise和/或warden是否适合您的身份验证需求?
答案 1 :(得分:0)
因为/layouts/_header.html.erb没有控制器,我该怎么做?
你的布局做有控制器。否则他们就不可能被渲染出来。
您现在正在执行的操作将按照其编写的方式工作,并且将最小化查询数量,并且您的布局文件将可以访问{{1帮助器,只要您通过控制器中的current_user
将其提供给您的视图。
你的代码真的没什么问题;你认为自己遇到的所有问题,你可能都没有。
答案 2 :(得分:0)
来自以下
“我有一个包含许多规则的标题,因为我有多种类型的配置文件”
我猜您正在根据用户角色验证多个条件。如果我的假设是正确的那么
最好为每个角色创建单独的部分。例如,如果您有管理员角色,那么
在布局/ _admin.html.erb中创建部分
然后你可以把它包含在
中<%= render "layouts/" + current_user.role %>