条件页面缓存[解决方案:条件片段缓存]

时间:2011-05-30 08:03:44

标签: ruby-on-rails ruby ruby-on-rails-3 caching

假设我有一个操作home_controller.rb的控制器index

我想缓存索引页面,所以我正在做:

caches_page :index

但希望它仅为未登录的用户进行缓存。如果我将使用条件:

caches_page :index, :if => :user_not_signed_in?

首页未登录时,页面将被缓存。现在,每个登录用户也会看到未登录的内容。有没有办法在不更改网址的情况下分离此操作?

3 个答案:

答案 0 :(得分:6)

你想要的东西无法实现;

页面已缓存或未缓存。该过程检查html文件的存在或处理它。

你还有两种选择:

  • 使用动作缓存或片段缓存(不推荐)

  • 更推荐:使用ajax加载用户特定部分,这样你只需要一个页面总是被缓存,并且动态插入特定数据(比如stackoverflow)

以下是最先进的解释:http://railslab.newrelic.com/scaling-rails

答案 1 :(得分:3)

接受的答案现已过时,因为条件缓存现在可在Rails 4中使用。pull requestmerged 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_ifcache_unless似乎是现在正确的方法:

cache_if(condition, name = {}, options = nil, &block)
cache_unless(condition, name = {}, options = nil, &block)

您的代码:

<% cache_unless @user.changed?, [ @user, 'form' ] do %>