对Rails视图的查询较少

时间:2013-10-22 13:57:19

标签: ruby-on-rails view ruby-on-rails-4

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

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

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

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

3 个答案:

答案 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 %>