0

在我的应用程序中,我有一个包含许多规则的标题,因为我有多种类型的配置文件。

我只想进行一个查询(可能是两个)来获取用户并进行我需要的所有检查

在我的应用程序控制器中,我有这个方法:

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 没有控制器,我该怎么做?

4

3 回答 3

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。或者更好的是,您是否考虑过设计和/或看守是否适合您的身份验证需求?

于 2013-10-22T15:31:54.493 回答
0

由于 /layouts/_header.html.erb 没有控制器,我该怎么做?

您的布局确实有控制器。以其他方式呈现它们是不可能的。

您现在所做的将按其编写方式工作,并且它将最小化查询的数量,并且您的布局文件可以访问current_user帮助程序,前提是您已通过helper_method :current_user控制器将其提供给您的视图。

无论如何,您的代码确实没有问题;你认为你有的所有问题,你可能并没有真正有。

于 2013-10-22T15:37:58.393 回答
0

从以下

我有一个有很多规则的标题,因为我有很多类型的配置文件

我猜您正在根据用户角色验证多个条件。如果我的假设是正确的

更好地为每个角色创建单独的部分。例如,如果您有管理员角色,那么

在 layouts/_admin.html.erb 中创建部分

然后你可以将它包含为

<%= render "layouts/" +  current_user.role %>
于 2013-10-22T16:46:29.240 回答