假设我有一个操作home_controller.rb
的控制器index
。
我想缓存索引页面,所以我正在做:
caches_page :index
但希望它仅为未登录的用户进行缓存。如果我将使用条件:
caches_page :index, :if => :user_not_signed_in?
首页未登录时,页面将被缓存。现在,每个登录用户也会看到未登录的内容。有没有办法在不更改网址的情况下分离此操作?
答案 0 :(得分:6)
你想要的东西无法实现;
页面已缓存或未缓存。该过程检查html文件的存在或处理它。
你还有两种选择:
使用动作缓存或片段缓存(不推荐)
更推荐:使用ajax加载用户特定部分,这样你只需要一个页面总是被缓存,并且动态插入特定数据(比如stackoverflow)
答案 1 :(得分:3)
接受的答案现已过时,因为条件缓存现在可在Rails 4中使用。pull request为merged into 4.0.0rc1,允许:if
和:unless
参数被传递给cache
。这允许模板为DRY,因为不再需要复制有条件缓存的块。
用法:
<% cache [ @user, 'form' ], :unless => @user.changed? do %>
<%= render partial: 'shared/error_messages', locals: {instance: @user} %>
<%= form_for @user do |f| %>
<div class="field">
<div><%= f.label :name %></div>
<div><%= f.text_field :name %></div>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% end %>
答案 2 :(得分:1)
cache_if和cache_unless似乎是现在正确的方法:
cache_if(condition, name = {}, options = nil, &block)
cache_unless(condition, name = {}, options = nil, &block)
您的代码:
<% cache_unless @user.changed?, [ @user, 'form' ] do %>