举例理解Ruby on Rails的页面缓存机制

2019-09-25 09:43:49王振洲

第一个函数从 Javascript 中读取 cookie 值,第二个函数处理此 DOM。可以通过使用 Prototype 库简化这段代码,但我包括了基本的 DOM 查找以便于读者理解。最后一步是在页面加载时调用 JavaScript 函数。我向布局中添加了如下代码:
清单 5. 当页面加载时调用 JavaScript 函数

  <script type="text/javascript">
   window.onload = function() {
     handle_cached_user();

     <%= render_nifty_corners_javascript %>
      <%= yield :javascript_window_onload %>
   }
  </script>

上述 JavaScript 代码十分简单。在页面加载时,将加载 handle_cached_user 函数,而它会相应地显示或隐藏正确的内容。现在,我尽可以通过向控制器中添加如下代码来启用页面缓存:

  caches_page :index

上述代码效果极佳。我还是需要定期地从缓存中删除前页,这样我才能使该页期满终止。为此,我只需简单地定期删除 public/index.html。hide-and-seek 方式对于有几类用户的页面十分有效,但对于如图 2 中所示的用户 partial 效果却不佳。对于后者,需要综合使用 hide-and-seek 和 show-and-tell 技巧。
实现 show-and-tell

再来看看 图 2。我将使用 hide-and-seek — 根据用户是否已登录 — 选择 partial 的正确版本,然后使用 show-and-tell 技巧根据我之前在清单 3 的行 4 和行 5 中所写的 cookies 的内容填充页面的动态部分。请记住,对于 show-and-tell,我特别更改了页面的元素以符合单个用户的情况。

首先,完成在这两个 partial (即登出用户和登录用户)上呈现的静态内容。我假设用户已经登出,所以我会通过附加 display: none 风格隐藏 logged_in div。之后,如果必要,我就可以用 JavaScript 显示或隐藏它们。请注意,我使用了相同的两个名称:logged_in 和 logged_out,来识别每个 div,这样便无需对我为这个主页所编写的 JavaScript 进行修改:
清单 6. 呈现登录和登出这两个 partial

<div class="boxRight sideColumnColor">
  <div id='logged_in'>
    <%= render :partial => 'common/logged_in' style="display: none; %>
  </div>
  <div id='logged_out'>
    <%= render :partial => 'common/logged_out' %>
  </div>
</div>

接下来,完成 logged_in partial 的内容。注意,每个包含动态内容的 HTML 组件都有一个 ID,从而我可以使用 JavaScript 找到它并随后将其替换:
清单 7. 显示 logged_in partial

<div id='logged_in' style="display: none;">

 <%= link_to %(<span class="mainBodyDark">Hi, </span>) +
    %(<span class="textLarge mainBodyDark"><b id='bold_link'>) + "my_login" +
    %(</b></span>), {:controller => 'profiles', :action => 'show', :id => 'my_login'},
 {:id => 'profile_link'} %>
 <br/>

 <div id='picture_and_link'>
   <a href="http://member/my_login" id='link_for_member_thumbnail'>
     <img id='member_thumbnail'
        alt="Def_member_thumbnail"
        src="/images/default/def_member_thumbnail.gif" /></a>
 </div>

 <div id="not_mine">Not my_login?</div>
 <br/>
 <%= image_button "logout", :controller => "members", :action => "logout" %>