【发布时间】:2017-05-03 10:36:57
【问题描述】:
我的 _profile.html.erb 部分中有这个:
<% cache [current_user.roles.first, profile, @selected_profile, params[:rating]] do %>
但这是我在服务器日志中看到的:
Read fragment views/profiles/26-20161212033839290582/profiles/52-20161213010040474070/profiles/14-20161213015458288839/profiles/34-20161212035644491093/profiles/33-20161212035644237925/profiles/38-20161207092843851446/profiles/35-20161212040016291016/profiles/36-20161212040016565707/profiles/4-20161213021028862933/profiles/39-20161207092843925084/profiles/46-20161207092844067579/profiles/47-20161207223703646028/profiles/37-20161212040016656625/660bdc6ad0b20e4c5329112cf79946f7 (0.1ms)
我在那里没有看到关于roles 的任何信息。
发生的情况是,如果我以具有 admin 角色的用户身份登录,然后以具有另一个角色的用户身份登录,我会看到缓存的 profiles 显示为好像我是管理员而不是与其他具有正确视图的用户一样。
这可能是什么原因造成的,我该如何解决?
编辑 1
如果我将cache 语句更改为:
<% cache [current_user, profile, @selected_profile, params[:rating]] do %>
刷新一下,日志是这样的:
Write fragment views/users/2-20161218005548388099/profiles/37-20161212040016656625///bb163edd4a8c7af2db71a04243338e7b (0.1ms)
Rendered collection of profiles/_profile.html.erb [1 times] (25.4ms)
Write fragment views/profiles/26-20161212033839290582/profiles/52-20161213010040474070/profiles/14-20161213015458288839/profiles/34-20161212035644491093/profiles/33-20161212035644237925/profiles/38-20161207092843851446/profiles/35-20161212040016291016/profiles/36-20161212040016565707/profiles/4-20161213021028862933/profiles/39-20161207092843925084/profiles/46-20161207092844067579/profiles/47-20161207223703646028/profiles/37-20161212040016656625/83ddeaa031bf68e602ce66af2d268317 (0.1ms)
编辑 2
当我binding.pry 进入_profile.html.erb 时,我得到以下信息:
[3] pry(#<#<Class:0x007f968480ec98>>)> current_user.roles.first
=> #<Role:0x007f969e4422a8 id: 1, name: "admin", resource_id: nil, resource_type: nil, created_at: Mon, 12 Sep 2016 00:38:47 UTC +00:00, updated_at: Mon, 12 Sep 2016 00:38:47 UTC +00:00>
我什至尝试了以下方法:
<% cache [current_user.roles.first.name, profile, @selected_profile, params[:rating]] do %>
当以非管理员用户身份登录时,它仍然给我与管理员用户相同的缓存结果。
编辑 3
这是调用集合的cache 块,该集合调用了_profile.html.erb:
<% cache @profiles do %>
<div class="wrapper wrapper-content">
<% @profiles.to_a.in_groups_of(3, false).each do |profiles| %>
<div class="row">
<%= render partial: "profile", collection: profiles %>
</div>
<% end %>
</div>
<% end %>
【问题讨论】:
-
有没有可能嵌套在另一个缓存块中?
current_user在这个缓存块之前返回什么? -
我建议编写一个帮助规范或测试来检查缓存方法实际生成的内容。对我来说,出于某种原因,似乎有些东西正在通过一系列不同的配置文件强制递归。请注意不推荐您这样做的方式api.rubyonrails.org/classes/ActionView/Helpers/… 也许更简单的解决方案是重新考虑您想要的密钥
-
@EdmundLee 你是对的。它是嵌套的。我将父
cache block添加为Edit 3。刷新问题。 -
@marcamillion 你在 3 号还是 4 号轨道上?
-
@EdmundLee Rails 5.
标签: ruby-on-rails caching ruby-on-rails-5 russian-doll-caching